UVALive-6434(思维)
题目链接:https://vjudge.net/problem/UVALive-6434
题意:给你一串n个数字,要求你将这串数字分成m组,使得分组后他们的消耗和最小。其中消耗是这样定义的:每一组的消耗等于这组数据中最大数与最小数的差值。
思路:不难想到,两个数的差值要尽可能小的话,首先要对这组数进行排序,那么分组情况一定是在这组排序数中间进行切断分割。那么剩下的一个问题就是怎么去切割分段,根据排序后得到的每两个相邻数之间的差值,选择差值最大的m-1个数字对之间进行分割就好了。
代码:
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 int main() 5 { 6 int t; 7 scanf("%d", &t); 8 int ca = 1; 9 int a[110]; 10 int num[110]; 11 while(t--) 12 { 13 memset(a, 0, sizeof(a)); 14 memset(num, 0, sizeof(num)); 15 int ans = 0; 16 int n, m; 17 scanf("%d%d", &n, &m); 18 for(int i = 0; i < n; i++) 19 { 20 scanf("%d", &a[i]); 21 } 22 std::sort(a, a + n); 23 for(int i = 0; i < n - 1; i++) 24 { 25 num[i] = a[i + 1] - a[i]; 26 ans += num[i]; 27 } 28 std::sort(num, num + n - 1); 29 for(int i = 0; i < m - 1; i++) 30 { 31 ans -= num[n - 2 - i]; 32 } 33 printf("Case #%d: %d\n", ca, ans); 34 ca++; 35 } 36 return 0; 37 }