From Admin ☆零用钱 背景 Background USACO OCT09 7TH 描述 Description 作為创造產奶纪录的回报,Farmer John决定开始每个星期给Bessie一点零花钱。FJ有一些硬币,一共有N (1 <= N <= 20)种不同的面额。每一个面额都能整除所有比它大的面额。他想用给定的硬币的集合,每个星期至少给Bessie某个零花钱的数目C (1 <= C <= 100000000)。请帮他计算他最多能支付多少个星期的零花钱。 输入格式 Input Format * 第一行: 两个由空格隔开的整数: N 和 C* 第2到第N+1行: 每一行有两个整数表示一个面额的硬币:硬币面额V (1 <= V <= 100,000,000)和Farmer John拥有的该面额的硬币数B (1 <= B <= 1,000,000). 输出格式 Output Format * 第一行: 一个单独的整数,表示Farmer John最多能给Bessie支付多少个星期至少為C的零用钱。 样例输入 Sample Input 3 6 10 1 1 100 5 120 样例输出 Sample Output 111 时间限制 Time Limitation 各个测试点1s 注释 Hint FJ想要每个星期给Bessie六美分。他有100个1美分硬币,120个5美分硬币,和一个10美分硬币。FJ可以在一个星期超额付给Bessie一个10美分硬币。然后接下来的10个星期每星期付给Bessie两个5美分硬币。最后100个星期每星期付给Bessie一个1美分硬币跟一个5美分硬币。 #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node{ int val; int num;};node a[100];int n,c;bool cmp(node x,node y){ return x.val<y.val;}int main(){ while(scanf("%d%d",&n,&c)==2) { for(int i=1;i<=n;i++) scanf("%d%d",&a[i].val,&a[i].num); sort(a+1,a+n+1,cmp); int cnt=0; for(;a[n].val>=c;cnt+=a[n].num,n--); int flag=1; while(flag) { flag=0; int t=c; for(int i=n;i>=1;i--) { while(a[i].num>0&&t>=a[i].val) { a[i].num--; t-=a[i].val; } } for(int i=1;i<=n;i++) { while(a[i].num>0&&t>0) { a[i].num--; t-=a[i].val; } } if(t<=0) cnt++,flag=1; } printf("%d/n",cnt); }}