zoukankan      html  css  js  c++  java
  • 2013ACM/ICPC亚洲区南京站现场赛——题目重现

    GPA http://acm.hdu.edu.cn/showproblem.php?pid=4802

    签到题,输入两个表,注意细心点就行了。

     1 #include<cstdio>
     2 #include<cstring>
     3 const int M=16;
     4 char s[M],cp[M][M]={"A","A-","B+","B","B-","C+","C","C-","D","D-","F"};
     5 double si[]={4,3.7,3.3,3,2.7,2.3,2,1.7,1.3,1.0,0};
     6 int main(){
     7     int n;
     8     while(~scanf("%d",&n)){
     9         double ss=0;
    10         int sc=0,c;
    11         while(n--){
    12             scanf("%d%s",&c,s);
    13             for(int i=0;i<11;i++){
    14                 if(!strcmp(cp[i],s)){
    15                     ss+=si[i]*c;
    16                     sc+=c;
    17                     break;
    18                 }
    19             }
    20         }
    21         if(!sc){
    22             puts("0.00");
    23             continue;
    24         }
    25         printf("%.2f
    ",ss/sc);
    26     }
    27     return 0;
    28 }
    View Code

    Poor Warehouse Keeper http://acm.hdu.edu.cn/showproblem.php?pid=4803

    输入x,y表示最终的数量和总价,初始是1,1.  

    有两种操作可以选择 一种是 y+1,那么此时x不变,但是单价变大了一些。

    另一种选择是 x+1,此时单价不变,但是y =  y/x*(x+1) 其中x指的是变化之前的x,也就是说, 总价要变成之前的单价*现在的数量。

    综上所诉,单价不变或增大。如果x增大,y增大的是上一次的单价,如果使y增大,则单价变大,那么之后按x时y增大的也快。

    为了尽快使1,1达到输入的x,y,贪心的选择先增大y,使得单价变大,因为要达到x,早晚都要按x-1次,那么我们在之前使单价变大,就会使这x-1次带来的y的增加更多。

    但是单价有个上限,不能过大,否则x-1次必须按,y有可能超过目标。

    最后的做法,对每一次增加x之前,都尽可能的把y增大,也就是把单价增大,增大到不超过最终结果的最大单价以后,增加一次x,然后继续之前的选择。

     1 #include<cstdio>
     2 const double eps=1e-8;
     3 int main() {
     4     int x,y;
     5     while(~scanf("%d%d",&x,&y)) {///x是数量,y是总价
     6         if(x>y){                ///数量必须要按x-1次,初始单价1,所以x>y是无法按出的
     7             puts("-1");
     8             continue;
     9         }
    10         double k=(y+1-eps)/x;   ///最大的单价
    11         int ans=x-1;            ///按x-1次数量
    12         double tmp=1;           ///初始y的值
    13         for(int i=1;i<=x;i++) {
    14             double t=i*k;       ///当前可达到的最大总价
    15             int u=(int)(t-tmp); ///最多按总价的次数
    16             tmp+=u;             ///总价加上这么多次数
    17             tmp=tmp*(i+1)/i;    ///这是按了一下数量
    18             ans+=u;             ///这是加上按总价的次数,按数量的x-1次之前已经加了
    19         }
    20         printf("%d
    ",ans);
    21     }
    22     return 0;
    23 }
    View Code

    end

  • 相关阅读:
    POJ 2585 Window Pains 拓扑排序
    hrbust 2069 萌萌哒十五酱的衣服~ stl
    CodeForces 785D Anton and School
    CodeForces 816C Karen and Game
    CodeForces 758C Unfair Poll 模拟
    CodeForces 746D Green and Black Tea 有坑
    CodeForces 811C Vladik and Memorable Trip dp
    栈 队列 (面向对象列表实现)
    员工信息表 信息检索(模糊查询)
    员工信息表 查询 周末写(很简单)
  • 原文地址:https://www.cnblogs.com/gaolzzxin/p/3989240.html
Copyright © 2011-2022 走看看