uva 10670 Work Reduction (贪心)

uva 10670 Work Reduction

Paperwork is beginning to pile up on your desk, and tensions at the workplace are starting to mount. Your boss has threatened to fire you if you don’t make any progress by the end of the day. You currently haveN units of paperwork on your desk, and your boss demands that you have exactlyM units of paperwork left by the end of the day.

The only hope for you now is to hire help. There are various agencies which offer paperwork reduction plans:

For $A they will reduce your paperwork by one unit.For $B they will reduce your entire paperwork by half (rounding down when necessary).

Note that work can never be reduced to less than 0.

Your task now is to produce a sorted table of agency names and their respective minimum costs to solve your workload problem.

The first line of input consists of a single positive integer representing the number of cases to follow. Each case begins with three positive integers separated by spaces:N – your starting workload, M – your target workload, andL – the number of work reduction agencies available to you, (1 <= M <= N <= 100000, 1 <= L <= 100). The nextL lines have the format "[agency name]:A,B", whereA and B are the rates as described above for the given agency. (0 <= A,B <= 10000) The length of the agency name will be between 1 and 16, and will consist only of capital letters. Agency names will be unique.

For each test case, print "Case X", with X being the case number, on a single line, followed by the table of agency names and their respective minimum costs, sorted in non-decreasing order of minimum costs. Sort job agencies with identical minimum costs in alphabetical order by agency name. For each line of the table, print out the agency name, followed by a space, followed by the minimum required cost for that agency to solve your problem.

Sample Input 2100 5 3A:1,10B:2,5C:3,11123 1122 5B:50,300A:1,1000C:10,10D:1,50E:0,0Sample Output Case 1C 7B 22A 37Case 2E 0A 1D 1C 10B 50

题目大意:每组数据包括两个部分:

1)N总任务数,M目标任务数,L公司数目。

2)L行,每行3个有效数据:编号(长度1~16),完成一个任务所需的金额,完成一般任务所需的金额(一半为 (当前任务数 + 1) / 2)。

求每家公司完成N – M个任务所需的最小金额,按金额的升序输出,若金额相同,按字符序输出。

解题思路:贪心。先减半,,减半到不能再减(再减小于M),或者减半的性价比不如减一时,开始减一。

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;int N, M, L;char s[10000];struct A{char id[20];int a, b, sum;};A f[10500];int cmp(A p, A q) {if (p.sum != q.sum) {return p.sum < q.sum;}else return strcmp(p.id, q.id) < 0;}void cal(int x) {f[x].sum = 0;int temp = N;while (temp – (temp + 1) / 2 >= M && f[x].b < (temp + 1) / 2 * f[x].a) {temp -= (temp + 1) / 2;f[x].sum += f[x].b;}f[x].sum += f[x].a * (temp – M);}int main() {int T, Case = 1;scanf("%d", &T);while (T–) {printf("Case %d\n", Case++);scanf("%d %d %d\n", &N, &M, &L);for (int i = 0; i < L; i++) {scanf("%s", s);for (int j = 0; j < strlen(s); j++) {if (s[j] == ':') {s[j] = ' ';break;}}sscanf(s, "%s%d,%d\n", f[i].id, &f[i].a, &f[i].b);cal(i);}sort(f, f + L, cmp);for (int i = 0; i < L; i++) {printf("%s %d\n", f[i].id, f[i].sum);}}return 0;}

太过于近,彼此身上隐性的刺又会深深的伤害对方。

uva 10670 Work Reduction (贪心)

相关文章:

你感兴趣的文章:

标签云: