开始的时候并不觉得这道题有难度,但是当我RE两次以后,我蛋疼了,不知道错在哪了,
看了人家的代码后,才知道自己在读取名字时出错了,名字不是一个大写字符,而是由多个大写字符组成的字符串。
改过以后,就A掉了,
从这道题中,我有学会了新东西,就是在scanf函数中%[]的应用,
点击打开链接
思路就是从N开始每一步都按照最优方式走下去,那么怎么选择最有方式呢,就是比较money/unit这个比值,这个值代表每个unit的价格,每次都是选择最少的开销,
注意我们要考虑最后的M值,最后的状态要等于M。
代码如下:
#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> typedef struct { char na[20]; int co; }ANS; int n, m, l, a, b; ANS ans[110]; float la, lb; int comp(const void *a, const void *b) { ANS *aa = (ANS*)a, *bb = (ANS*)b; if(aa->co!=bb->co)return aa->co - bb->co; else return strcmp(aa->na,bb->na); } int main () { int cas; char ch[20]; scanf("%d",&cas); for(int tt = 0; tt < cas; tt++) { scanf("%d%d%d",&n,&m,&l);getchar(); for(int i = 0; i < l; i++) { scanf("%[A-Z]:%d,%d",ch,&a,&b);getchar(); int tans = 0, tn = n; while(tn>m) { la = a; lb = 1.0*b/(tn-round(1.0*tn/2)); if(la>=lb&&tn-round(1.0*tn/2)>=m) {tn = tn-round(1.0*tn/2); tans+=b;} else { tn -= 1; tans+=a; } } ans[i].co = tans; strcpy(ans[i].na,ch); } qsort(ans,l,sizeof(ans[0]),comp); printf("Case %d\n",tt+1); for(int i = 0; i < l; i++) printf("%s %d\n",ans[i].na,ans[i].co); } return 0; }