zoukankan      html  css  js  c++  java
  • 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
    没有梦想,何谈远方
  • 相关阅读:
    git上刚下载的项目就显示有改动
    Windows Server 2012 R2安装Oracle 11g问题
    maven项目更换本地仓库
    dom4j创建和解析xml文档
    java倒计时三种简单实现方式
    JS倒计时两种种实现方式
    java加载properties文件的六中基本方式实现
    MYSQL 高级语法
    MYSQL 基础语法
    Sql 代码规范说明
  • 原文地址:https://www.cnblogs.com/zyue/p/3637541.html
Copyright © 2011-2022 走看看