注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。
Tomato是一个贪吃的小孩,每一天他都要吃很多的东西,这一次Tomato参加了912吃豆大赛,在大赛上一共有m种豆子可以吃,每一种豆子的分值是不一样的,谁吃的豆子的分值总和最大就是优胜者,Tomato目前的主要竞争对手是大胃王Wangkun和Gleiz,还有一匹黑马Cloudiris,毕竟Tomato不是神仙,他的胃最多可以装n个豆子,Tomato希望能吃到尽量多的分数,你能帮帮他吗?
Input
每一组数据有3行,第一行是n和m,(n<=1000,m<=1000),当n=0,m=0时输入结束;
第二行有m个数,第i个数表示第i种豆子的个数。
第三行有m个数,第i个数表示第i种豆子的分值。
Output
一个数字Tomato最多能获得的分数。
Sample Input
2 3
1 1 1
1 2 3
3 2
1 1
1 2
0 0
Sample Output
5
3
Source
Tomato
排序,先吃分值高的豆子。
#include <iostream>
using namespace std;
typedef struct DouZi
{
long c;
long w;
}Douzi;
int cmp(const void *a, const void *b)
{
return ((Douzi*)b)->w - ((Douzi*)a)->w;
}
int main()
{
Douzi D[1010];
long n, m;
long sum = 0;
cin >> n >> m;
while (n || m)
{
sum = 0;
for (long i = 0; i < m; i++)
cin >> D[i].c;
for (long i = 0; i < m; i++)
cin >> D[i].w;
qsort(D, m, sizeof(Douzi), cmp);
//for (long i = 0; i < m; i++)
// cout << D[i].w << endl;;
for (long i = 0; i < m && n; i++)
{
if (n >= D[i].c)
{
sum += D[i].w * D[i].c;
n -= D[i].c;
}
else
{
sum += D[i].w * n;
n = 0;
}
}
cout << sum << endl;
cin >> n >> m;
}
return 0;
}