开始的时候并不觉得这道题有难度,但是当我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;
}
本文分享了一次编程过程中遇到的问题及解决方案,重点在于优化算法选择和正确应用scanf函数来读取复杂数据类型。通过案例分析,作者深入探讨了如何通过比较money/unit来决定最优路径,并强调了在不同场景下使用合适的数据输入方法的重要性。
1377

被折叠的 条评论
为什么被折叠?



