公司要你要完成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;
}