您的位置:首页 > 其它

uva 10670(贪心)

2014-09-10 22:15 357 查看
题意:n份作业雇人做到刚好剩m份,雇佣有l种,每种都有两种方式,第一种是每次减少一份作业交a元,另一种是每次减少一半作业(向下取整)交b元,输出按付钱从小到大排好序的l种方案的付的钱数。

题解:贪心,每次先砍半,然后换算成第一种要付的钱的总数和第二种对比,取较小的将数字加上,最后按总数排序,如果相等按名字的字典序排序。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 105;

struct R {
int a, b, sum;
char name
;
}r
;
int n, m, l;

int cmp(R r1, R r2) {
if (r1.sum != r2.sum)
return r1.sum < r2.sum;
else
return strcmp(r1.name, r2.name) < 0;
}

int main() {
int t, cases = 1;
char c;
scanf("%d",&t);
while (t--) {
memset(r, 0, sizeof(r));
scanf("%d%d%d", &n, &m, &l);
getchar();
for (int i = 0; i < l; i++) {
int k = 0;
while ((c = getchar()) != ':')
r[i].name[k++] = c;
scanf("%d,%d", &r[i].a, &r[i].b);
getchar();
int temp = n, temp1, temp2;
while (temp > m) {
temp1 = temp / 2;
if (temp1 < m) {
r[i].sum += r[i].a * (temp - m);
break;
}
temp2 = 0;
while (temp > temp1) {
temp--;
temp2 += r[i].a;
}
if (temp2 < r[i].b)
r[i].sum += temp2;
else
r[i].sum += r[i].b;
}
}
sort(r, r + l, cmp);
printf("Case %d\n", cases++);
for (int i = 0; i < l; i++)
printf("%s %d\n", r[i].name, r[i].sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva