题意:
老板给你n个任务,你只能最多留m个,你干不了就辞了你,现在一个机构能帮你完成任务,有A,B两种方案,金额不同,A能帮你完成1个,B能帮你完成当前的一半。
思路:
贪心的思路,题目要求的其实就是关于A,B的选择,如过当前扣掉一半后所得>=m而且经费画得比A少就选B,否则就选择A
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;
struct comp{
char name[20];
int A, B;
int cnt;
}a[N];
char str[N];
int cmp(comp a,comp b) {
if (a.cnt != b.cnt)
return a.cnt < b.cnt;
else
return strcmp(a.name, b.name) < 0;
}
int n, m, l;
int main() {
int cas, Case = 0;
scanf("%d", &cas);
while (cas--) {
scanf("%d%d%d\n", &n, &m, &l);
for (int i = 0; i < l; i++) {
//scanf_s("%s:%d,%d\n", a[i].name, &a[i].A, &a[i].B);
gets(str);
int j;
for (j = 0; str[j] != ':'; ++j)
a[i].name[j] = str[j];
a[i].name[j] = '\0';
sscanf(str + j + 1, "%d,%d", &a[i].A, &a[i].B);
a[i].cnt = 0;
}
for (int i = 0; i < l; i++) {
int left = n;
int A = a[i].A, B = a[i].B;
int mid = (left + 1) / 2;
while (left - mid >= m &&B <= mid*A) {
a[i].cnt += B;
left -= mid;
mid = (left + 1) / 2;
}
if (left>m)
a[i].cnt += (left - m)*A;
}
printf("Case %d\n", ++Case);
sort(a, a + l, cmp);
for (int i = 0; i < l; i++)
printf("%s %d\n",a[i].name,a[i].cnt);
}
return 0;
}