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\n",ss/sc); 26 } 27 return 0; 28 }
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\n",ans); 21 } 22 return 0; 23 }
end