UVA_10670

    一开始不知道rounding down是四舍五入的意思,还以为是向下取整,果断就疑惑了……

    贪心的思路不难想到,如果减半不会使文件少于M且比单份划算的话就一直用减半即可。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXD 110
int N, M, L, cost[MAXD], a[MAXD], b[MAXD], r[MAXD];
char name[MAXD][20], temp[110];
int cmp(const void *_p, const void *_q)
{
int *p = (int *)_p;
int *q = (int *)_q;
if(cost[*p] == cost[*q])
return strcmp(name[*p], name[*q]);
else
return cost[*p] < cost[*q] ? -1 : 1;
}
void solve()
{
int i, j, k, s;
for(i = 0; i < L; i ++)
{
scanf("%s", temp);
for(j = 0; temp[j]; j ++)
if(temp[j] == ':' || temp[j] == ',')
temp[j] = ' ';
sscanf(temp, "%s%d%d", name[i], &a[i], &b[i]);
cost[i] = 0;
s = N;
while(s - (s + 1) / 2 >= M && b[i] < (s + 1) / 2 * a[i])
{
cost[i] += b[i];
s -= (s + 1) / 2;
}
cost[i] += (s - M) * a[i];
}
for(i = 0; i < L; i ++)
r[i] = i;
qsort(r, L, sizeof(r[0]), cmp);
for(i = 0; i < L; i ++)
printf("%s %d\n", name[r[i]], cost[r[i]]);
}
int main()
{
int i, t, tt;
scanf("%d", &t);
for(tt = 0; tt < t; tt ++)
{
printf("Case %d\n", tt + 1);
scanf("%d%d%d", &N, &M, &L);
solve();
}
return 0;
}