题意:海滩上有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\n",max);
39     }
40     return 0;
41 } 
View Code

 

posted on 2014-04-01 09:01  dark_dream  阅读(209)  评论(0编辑  收藏  举报