思路

  dp去维护前缀f[i-1] - ai的最小值

  

 

 CODE

 

 1 #include <bits/stdc++.h>
 2 #define dbg(x) cout << #x << "=" << x << endl
 3 
 4 using namespace std;
 5 typedef long long LL;
 6 
 7 template<class T>inline void read(T &res)
 8 {
 9     char c;T flag=1;
10     while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
11     while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
12 }
13 
14 namespace _buff {
15     const size_t BUFF = 1 << 19;
16     char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
17     char getc() {
18         if (ib == ie) {
19             ib = ibuf;
20             ie = ibuf + fread(ibuf, 1, BUFF, stdin);
21         }
22         return ib == ie ? -1 : *ib++;
23     }
24 }
25 
26 int qread() {
27     using namespace _buff;
28     int ret = 0;
29     bool pos = true;
30     char c = getc();
31     for (; (c < '0' || c > '9') && c != '-'; c = getc()) {
32         assert(~c);
33     }
34     if (c == '-') {
35         pos = false;
36         c = getc();
37     }
38     for (; c >= '0' && c <= '9'; c = getc()) {
39         ret = (ret << 3) + (ret << 1) + (c ^ 48);
40     }
41     return pos ? ret : -ret;
42 }
43 
44 const int kmaxn = 1007;
45 LL f[kmaxn];
46 LL a[kmaxn];
47 int n,k;
48 
49 int main()
50 {
51     read(n);
52     read(k);
53     for(int i = 1; i <= n; ++i) {
54         read(a[i]);
55     }
56 
57     sort(a+1, a+n+1);
58     LL temp = -a[1];
59     for(int i = 1; i < k; ++i) {
60         f[i] = 1 << 30;
61     }
62     for(int i = k; i <= n; ++i) {
63         f[i] = temp + a[i];
64         printf("f[%d]:%lld\n",i,f[i]);
65         temp = min(temp, f[i-k+1] - a[i-k+2]);
66         dbg(temp);
67         printf("f[%d]:%lld\n",i,f[i]);
68     }
69     printf("%lld\n",f[n]);
70     return 0;
71 }
View Code