【tyvj1032】零用钱

57 篇文章 0 订阅

描述

作為创造產奶纪录的回报,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<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct hp{
	int mon,num;
}a[50];
int j,k,n,m;
bool zz;
int cmp(hp a,hp b){
	return a.mon<b.mon;
}
int main(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;++i) scanf("%d%d",&a[i].mon,&a[i].num);
	sort(a+1,a+n+1,cmp);
	zz=true;
	j=0;
	while (zz){
		zz=false;
		k=m;
		for (int i=n;i>=1;--i)
		  while (a[i].num>0&&k-a[i].mon>=0){
		  	a[i].num--;a
		  	k-=a[i].mon;
		  }
		for (int i=1;i<=n;++i)
		  if (a[i].num>0&&k>0){
		  	a[i].num--;
		  	k-=a[i].mon;
		  }
		if (k<=0){
			j++;
			zz=true;
		}
	}
	printf("%d",j);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值