tyvj 1032 零用钱 给定硬币的集合,每次至少给某数目,问最多能支付多少个次。

 
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  
 
   
   
 样例输出 Sample Output  
 
   
   
 时间限制 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);
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值