题目描述
Frank是一个非常喜爱整洁的人。他有一大堆书和一个书架,想要把书放在书架上。书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上。但是Frank发现,由于很多书的宽度不同,所以书看起来还是非常不整齐。于是他决定从中拿掉k本书,使得书架可以看起来整齐一点。
书架的不整齐度是这样定义的:每两本书宽度的差的绝对值的和。例如有4本书:
1x2 5x3 2x4 3x1 那么Frank将其排列整齐后是:
1x2 2x4 3x1 5x3 不整齐度就是2+3+2=7
已知每本书的高度都不一样,请你求出去掉k本书后的最小的不整齐度。
输入输出格式
输入格式:第一行两个数字n和k,代表书有几本,从中去掉几本。(1<=n<=100, 1<=k<n)
下面的n行,每行两个数字表示一本书的高度和宽度,均小于200。
保证高度不重复
输出格式:一行一个整数,表示书架的最小不整齐度。
输入输出样例
输入样例#1:
4 1 1 2 2 4 3 1 5 3
输出样例#1:
3
f[i][j] 表示选了i本书,最后一本书是j,最小的不整齐度
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 7 struct bk{ 8 int h,w; 9 bool operator < (const bk &a) const 10 { 11 return h < a.h; 12 } 13 }t[110]; 14 int f[110][110]; 15 int n,m,ans=1e9; 16 17 int main() 18 { 19 scanf("%d%d",&n,&m); 20 for (int i=1; i<=n; ++i) 21 scanf("%d%d",&t[i].h,&t[i].w); 22 23 sort(t+1,t+n+1); 24 memset(f,0x3f,sizeof(f)); 25 for (int i=1; i<=n; ++i) f[1][i] = 0; 26 27 for (int i=2; i<=n-m; ++i) 28 for (int j=i; j<=n; ++j) 29 for (int k=1; k<j; ++k) 30 f[i][j] = min(f[i][j],f[i-1][k]+abs(t[j].w-t[k].w)); 31 for (int i=n-m; i<=n; ++i) ans = min(ans,f[n-m][i]); 32 printf("%d",ans); 33 return 0; 34 }