uva10670

来源:互联网 发布:java webservice部署 编辑:程序博客网 时间:2024/06/05 20:27

公司要你要完成N份任务,但是你是不可能全部完成的,所以需要雇佣别人来做,做到剩下M份时,自己再亲自出马。现在有个机构,有两种付费方式,第一种是每付A元帮你完成1份,第二种是每付B元帮你完成剩下任务的一半。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn = 105;char str[maxn];int n, m, l;struct node {    char name[maxn];    int half;    int per;    int money;}p[maxn];void deal (int j) {    int k = 0,i;    for (i = 0; i < strlen (str); i++) {        if (str[i] != ':')            k++;        else            break;      }    memcpy (p[j].name, str, sizeof (str));    p[j].name[k] = '\0';    int sum = 0;    for (i = k + 1; i < strlen (str); i++) {        if (str[i] != ',')            sum = sum * 10 + str[i] - '0';        else {            p[j].per = sum;            sum = 0;        }    }    p[j].half = sum;   }void cal(int cur) {    int num = n;    int sum = 0;    while(num/2>=m && (p[cur].per*(num-num/2))>=p[cur].half) {        sum += p[cur].half;        num/=2;    }    sum += (num-m)*p[cur].per;    p[cur].money = sum;}int cmp (const node & x, const node & y) {    if (x.money < y.money)        return true;    else if (x.money > y.money)        return false;    else return strcmp (x.name, y.name) < 0 ? true: false;}int main() {    int kase;    int cas = 1;    scanf("%d", &kase);    int i, j;    while(kase--) {        printf("Case %d\n", cas++);        scanf("%d%d%d", &n, &m, &l);        getchar();        for(i=0; i<l; i++) {            gets(str);            deal(i);            cal(i);        }        sort(p, p+l, cmp);        for (j = 0; j < l ; j++)            printf ("%s %d\n", p[j].name, p[j].money);    }    return 0;}
0 0
原创粉丝点击