题意:海滩上有n个石头,每个石头有两个值 a,b ,每取一个石头,所有石头的a值都要减去取的那个石头的b值(包括已经取到过的了),问你最后你能取到石头a的和的最大值是多少;
解题思路:
如果我们取1个
则 和为 a[k] - b[k];(任选)
如果我们取 2个
则和为 a[i] - b[i] - b[j] + a[j] - b[i] - b[j] = a[i] - 2 * b[i] + a[j] - 2* b[j];
以此类推,最后我们知道取k个 的和就是 k个 a[i] - k*b[i] 的和; 所以我们只需要枚举 我们要取的个数,然后对a[i] - k*b[i]进行排序,取前k个即可
解题代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 struct node 5 { 6 int a,b,c; 7 }dp[1010]; 8 int cmp(const void *a ,const void *b) 9 { 10 return (*(node *)b).c - (*(node *)a).c; 11 } 12 int main() 13 { 14 int n; 15 while(scanf("%d",&n)!=EOF&&n!=0) 16 { 17 for(int i= 1;i<= n;i++) 18 { 19 scanf("%d%d",&dp[i].a,&dp[i].b); 20 } 21 long long max = 0; 22 for(int i = 1;i <= n; i ++) 23 { 24 for(int j = 1; j<= n;j ++) 25 { 26 dp[j].c = dp[j].a - i * dp[j].b; 27 } 28 qsort(dp+1,n,sizeof(node),cmp); 29 long long sum = 0 ; 30 31 for(int j = 1; j <= i;j ++) 32 { 33 sum += dp[j].c; 34 if(sum > max) 35 max = sum ; 36 } 37 } 38 printf("%lld ",max); 39 } 40 return 0; 41 }