• WHU1537 Stones I (数学)


    题意:海滩上有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 } 
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    Linux文件结构
    磁盘分区
    BASH简介
    磁盘的基本概念
    Linux文件操作
    创建文件系统
    文件系统挂载
    一些常用命令
    asp.net创建PPT
    asp.net创建、删除、移动文件夹 文件
  • 原文地址:https://www.cnblogs.com/zyue/p/3637541.html
Copyright © 2020-2023  润新知