POJ3040--Allowance(贪心)
http://poj.org/problem?id=3040
思路:
输入时,如果有大于c的,直接把数量加到结果中,不把他加到数组中
把钱按面值排序
想取最大面额的钱,保证取到的钱小于等于c
然后取最小面额的钱
#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
int main(){
int n,c;
cin>>n>>c;
int ans=;
vector<pair<int,int> > v;
for(int i=;i<n;i++){
int a,b;
cin>>a>>b;
if(a>=c)
ans+=b;
else
v.push_back(make_pair(a,b));
}
int use[];
sort(v.begin(),v.end());
while(true){
int money=;
memset(use,,sizeof(use));
int flag=;//1表示成立 0不成立
for(int i=v.size()-;i>=;i--){
if(v[i].second!=){
int amount=(c-money)/v[i].first;
int minn=min(amount,v[i].second);
// v[i].second-=minn; 不能这样取了就直接减到.因为可能目前这种取法,并不成立
money+=v[i].first*minn;
use[i]=minn;
if(money==c){
flag=;
break;
}
}
}
if(flag==){
for(int j=;j<v.size();j++){
if(v[j].second!=&&v[j].second>use[j]){
int diff=c-money;
int amount=diff/v[j].first;
if(amount==)//如果0,说明当前的差值小于c,所以只要再取一个,就可以大于c
amount=;
int minn=min(amount,v[j].second);
money+=v[j].first*minn;
use[j]+=minn;
if(money>=c){
flag=;
break;
}
}
}
}
if(flag==){
int minn=INT_MAX;
for(int i=;i<v.size();i++){
if(use[i]!=){
minn=min(minn,v[i].second/use[i]);
}
}
ans+=minn;
for(int i=;i<v.size();i++){
if(use[i]!=){
v[i].second-=use[i]*minn;
}
}
}
else{
break;
}
}
cout<<ans<<endl;
return ;
}
POJ3040--Allowance(贪心)的更多相关文章
- poj-3040 Allowance (贪心)
http://poj.org/problem?id=3040 FJ 有n种不同面值的硬币,每种硬币都有相应的个数,大面值的硬币值总能被小面值的硬币值整除,每周需要支付 Bessie c元,问最多能 ...
- poj3040(双向贪心)
Allowance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1540 Accepted: 637 Descript ...
- POJ 3040 Allowance 贪心
这题目的贪心思路还是有一点细节问题的. 还没有证明,据说是因为题目给的条件是每个价格是比它小的价格的倍数才能这么贪心的. 思路如下: 假设要给奶牛的钱为C 1)从大面值到小面值一次拿钱,能拿多少拿多少 ...
- poj3040 Allowance
思路: 贪心. 看了题解说是 先把面值从大到小排序然后从头往尾扫,只要不超额,能取多少去多少然后如果还有剩余,就从尾往头扫,尽量取,让他恰好超额 不过并不懂证明. 实现: #include <i ...
- 《挑战程序设计竞赛》2.2 贪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262
POJ3617 Best Cow Line 题意 给定长度为N的字符串S,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下列任意操作: 从S的头部(或尾部)删除一个字符,加到T的尾部 ...
- 【贪心算法】POJ-3040 局部最优到全局最优
一.题目 Description As a reward for record milk production, Farmer John has decided to start paying Bes ...
- 【POJ - 3040】Allowance(贪心)
Allowance 原文是English,这里就放Chinese了 Descriptions: 作为创纪录的牛奶生产的奖励,农场主约翰决定开始给Bessie奶牛一个小的每周津贴.FJ有一套硬币N种(1 ...
- POJ 3040 Allowance【贪心】
POJ 3040 题意: 给奶牛发工资,每周至少 C 元.约翰手头上有面值V_i的硬币B_i个,这些硬币的最小公约数为硬币的最小面值.求最多能发几周? 分析: 贪心策略是使多发的面额最小(最优解).分 ...
- 【BZOJ】1685: [Usaco2005 Oct]Allowance 津贴(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1685 由于每个小的都能整除大的,那么我们在取完大的以后(不超过c)后,再取一个最小的数来补充,可以证 ...
- poj3040 发工资(贪心)
题目传送门 题目大意:给一个人发工资,给出不同数量不同面额,(大面额一定是小面额的倍数),问最多能发几天,(每天实发工资>=应发工资). 思路:首先,将大于等于c的面额的钱直接每个星期给奶牛一张 ...
随机推荐
- ajax请求aspx.cs后台方法
前台jquery代码 $(function () { $("#btnfix").click(function () { $.ajax({ type: "post" ...
- linux安装jdk1.8.0_91
1,创建一个目录,安装jkd. # mkdir -pv /usr/local/jdk 2,按照需要下载jdk版本. 下载地址: https://www.oracle.com/technetwork ...
- redis+Keepalived主从热备切换实例
[root@cache-redis-~/]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived globa ...
- STM32的命名规范
STM32F407VET6 STM32F407代表的是芯片的型号后面的字符表示芯片的信息 V这一项代表引脚数,其中T代表36脚,C代表48脚,R代表64脚,V代表100脚,Z代表144脚,I代表176 ...
- python基础 ---- 安装
------ 安装两个软件就行了 1.Anaconda 地址: 作用: 管理不同版本的python 的第三方包 下载第三方依赖包和构造版本开发环境 2.python常用的IDE环境 2.1 P ...
- C#导入c++ dll报找不到dll文件 masm32调用c++类库
最近需要在C#下调用一个c++ dll库,不管怎样dllimport就是报错找不到该dll文件,路径.函数名称.参数.dllimport参数逐个检查确认无误也无济于事,无奈想用其他语言调用试试,由于是 ...
- How to Reset VW Steering Assist 1S1909144P with OBDSTAR X300 DP
Vehicle model:VW Polo 2015 (or other Audi, Seat, Skoda, VW with unit 1S1 909 144 P) Module:Control u ...
- optional install error: Package require os(darwin) not compatible with your platform(win32)
解决方法: cnpm rebuild node-sass cnpm install
- centos 7 安装vscode
网上很多写的安装,会遇到一个问题,就是无法启动: sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh ...
- n的m划分 整数拆分问题
n的m划分 将n划分成若干个不超过m的数(正整数)的和,问有几种划分情况. 现在根据n和m的关系,考虑下面几种情况: 当n=1时,不论m的值为多少,只有一种划分,即{1}: 当m=1时,不论n的值为多 ...