uva10670 - Work Reduction(减轻工作)

开始的时候并不觉得这道题有难度,但是当我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;
}


你可能感兴趣的:(uva10670 - Work Reduction(减轻工作))