背景
USACO OCT09 7TH
描述
作為创造產奶纪录的回报,Farmer John决定开始每个星期给Bessie一点零花钱。
FJ有一些硬币,一共有N (1 <= N <= 20)种不同的面额。每一个面额都能整除所有比它大的面额。
他想用给定的硬币的集合,每个星期至少给Bessie某个零花钱的数目C (1 <= C <=
100000000)。请帮他计算他最多能支付多少个星期的零花钱。
输入格式
* 第一行: 两个由空格隔开的整数: N 和 C
* 第2到第N+1行: 每一行有两个整数表示一个面额的硬币:硬币面额V (1 <= V <=
100,000,000)和Farmer John拥有的该面额的硬币数B (1 <= B <=
1,000,000).
输出格式
* 第一行: 一个单独的整数,表示Farmer John最多能给Bessie支付多少个星期至少為C的零用钱。
测试样例1
输入
3 6
10 1
1 100
5 120
输出
111
备注
FJ想要每个星期给Bessie六美分。他有100个1美分硬币,120个5美分硬币,和一个10美分硬币。
FJ可以在一个星期超额付给Bessie一个10美分硬币。然后接下来的10个星期每星期付给
Bessie两个5美分硬币。最后100个星期每星期付给Bessie一个1美分硬币跟一个5美分硬
币。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; int N,C,ans,flag=1,k; struct cc{ int mon,num; }a[25]; bool cmp(cc a,cc b){ return a.mon<b.mon; } void init_(){ scanf("%d%d",&N,&C); for(int i=1;i<=N;++i){ scanf("%d%d",&a[i].mon,&a[i].num); } sort(a+1,a+N+1,cmp); } void solve(){ for(int i=N;i>=1;--i){ while(a[i].num>0&&k-a[i].mon>0){ --a[i].num; k-=a[i].mon; } } for(int i=1;i<=N;++i){ while(a[i].num>0&&k>0){ --a[i].num; k-=a[i].mon; } } } int main(){ // freopen("01.txt","r",stdin); init_(); while(flag){ flag=0; k=C; solve(); if(k<=0){ ++ans; flag=1; } } printf("%d\n",ans); return 0; }贪心,记得排序
吐槽一下,usaco很喜欢奶牛?这几天tyvj做下来全是奶牛
时间: 2024-12-11 22:40:11