略坑。
看不懂rounding down when necessary,百度翻译,以为是向下取整,然后痛快地给了好几发WA,还以为自己其他地方错了,实在受不了了看了别人的解题报告才知道是四舍五入的意思。
思路:
①对于每一个公司,如果
1.当前工作量减去减半之后的工作量仍>=目标工作量。
2.减半的钱<完成减半的工作量*单独的钱
则当前工作量减去公司帮忙完成的一半,继续循环。
说得有点乱,不过大家想一下就能想出来了。
②如果第一次发现减半不合算,以后肯定都不合算了。直接一份一份完成。
③不能一次性减到目标工作量以下。。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct AGENCY
{
int cost;
char name[20];
};
AGENCY agen[110];
bool cmp(const AGENCY &a, const AGENCY &b)
{
if (a.cost != b.cost)
return a.cost < b.cost;
else
return strcmp(a.name, b.name) < 0;
}
int main()
{
//freopen("input.txt", "r", stdin);
int i, j, start, target, unit, half, T, n, cost, temp, cases = 1;
scanf("%d%*c", &T);
while (T--)
{
memset(agen, 0, sizeof(agen));
scanf("%d%d%d%*c", &start, &target, &n);
for (i = 0; i < n; i++)
{
cost = 0;
int k = 0;
char ch;
while ((ch = getchar()) != ':')
agen[i].name[k++] = ch;
agen[i].name[k] = 0;
scanf("%d,%d%*c", &unit, &half);
int cur = start;
int temp = (cur + 1) / 2;
while (cur - temp >= target && half <= temp * unit)
{
cost += half;
cur -= temp;
temp = (cur + 1) / 2;
}
if (cur > target)
cost += (cur - target) * unit;
agen[i].cost = cost;
}
sort(agen, agen + n, cmp);
printf("Case %d\n", cases++);
for (i = 0; i < n; i++)
printf("%s %d\n", agen[i].name, agen[i].cost);
}
return 0;
}