UVa 10670 - Work Reduction

传送门UVa 10670 - Work Reduction


略坑。


看不懂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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值