poj3040
一、题意:约翰要给他的牛贝西发工资,每天不得低于C元,约翰有n种面值的钱币,第i种的面值为v_i,数量有b_i。问这些钱最多给贝西发多少天的工资。注意,每种面值的金钱都是下一种的面值的倍数。
二、思路:分三步解决:1. 按照面值从大到小取,面值大于等于C的,直接取光。2. 再按面值从大到小取,凑近C,可以小于等于C,但不能大于C.3.最后从小到大取,凑满C,这里的凑满可以等于大于C。然后将上述2,3步取到的面值全部取走,再转入步骤2,这样每次找到的取法就是当前最优取法,直到所剩下的金币总价值不够C结束。
三、代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#define MAXN 11111
#define MAXM 222222
#define INF 1000000000
using namespace std;
int n, c;
typedef pair<int, int> P;
P a[];
int use[], sum[];
int main()
{
scanf("%d%d", &n, &c);
for(int i = ; i < n; i++) scanf("%d%d", &a[i].first, &a[i].second);
sort(a, a + n);
int ans = ;
for(int i = n - ; i >= ; i--)
if(a[i].first >= c)
{
ans += a[i].second;
a[i].second = ;
}
while(true)
{
int flag = ;
int tmp = c; memset(use, , sizeof(use));
for(int i = n - ; i >= ; i--)
if(a[i].second)
{
int k = tmp / a[i].first;
int mi = min(a[i].second, k);
tmp -= mi * a[i].first;
use[i] = mi;
if(tmp <= )
{
flag = ;
break;
}
}
if(tmp > )
{
for(int i = ; i < n; i++)
if(a[i].second > use[i])
{
while(use[i] < a[i].second)
{
tmp -= a[i].first;
use[i]++;
if(tmp <= )
{
flag = ;
break;
}
}
if(tmp <= ) break;
}
}
if(!flag) break;
int mx = INF;
for(int i = n - ; i >= ; i--)
if(use[i]) mx = min(mx, a[i].second / use[i]);
ans += mx;
for(int i = n - ; i >= ; i--)
if(use[i]) a[i].second -= mx * use[i]; }
printf("%d\n", ans);
return ;
}
poj3040的更多相关文章
- poj-3040 Allowance (贪心)
http://poj.org/problem?id=3040 FJ 有n种不同面值的硬币,每种硬币都有相应的个数,大面值的硬币值总能被小面值的硬币值整除,每周需要支付 Bessie c元,问最多能 ...
- 【贪心算法】POJ-3040 局部最优到全局最优
一.题目 Description As a reward for record milk production, Farmer John has decided to start paying Bes ...
- poj3040 发工资(贪心)
题目传送门 题目大意:给一个人发工资,给出不同数量不同面额,(大面额一定是小面额的倍数),问最多能发几天,(每天实发工资>=应发工资). 思路:首先,将大于等于c的面额的钱直接每个星期给奶牛一张 ...
- poj3040(双向贪心)
Allowance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1540 Accepted: 637 Descript ...
- poj3040 Allowance
思路: 贪心. 看了题解说是 先把面值从大到小排序然后从头往尾扫,只要不超额,能取多少去多少然后如果还有剩余,就从尾往头扫,尽量取,让他恰好超额 不过并不懂证明. 实现: #include <i ...
- POJ3040贪心
题意:作为创纪录的牛奶生产的奖励,农场主约翰决定开始给Bessie奶牛一个小的每周津贴.FJ有一套硬币N种(1≤N≤20)不同的面额,每枚硬币是所有比他小的硬币面值的倍数,例如1美分硬币.5美分硬币. ...
- POJ3040给奶牛发工资
题意: 有n种硬币,每种硬币有mi个,然后让你给奶牛发工资,每周发至少c元(就是不找零钱的意思)然后问你能发几周?(硬币之间都是倍数关系) 思路: 这个题目做了两天,丢脸,看完 ...
- 《挑战程序设计竞赛》2.2 贪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262
POJ3617 Best Cow Line 题意 给定长度为N的字符串S,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下列任意操作: 从S的头部(或尾部)删除一个字符,加到T的尾部 ...
- 【POJ - 3040】Allowance(贪心)
Allowance 原文是English,这里就放Chinese了 Descriptions: 作为创纪录的牛奶生产的奖励,农场主约翰决定开始给Bessie奶牛一个小的每周津贴.FJ有一套硬币N种(1 ...
随机推荐
- bootstrap列排序
<!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 列排序</title> <li ...
- Requests接口测试(一)
接口测试概念 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关 ...
- OpenSSH/PuTTY/SSH使用
OpenSSH/PuTTY/SSH 常用SSH服务指令 ① 启动SSH服务的命令 service sshd start ② 停止SSH服务的命令 service sshd stop ③ 重新启动SSH ...
- Python - selenium_WebDriver 鼠标键盘事件
from selenium import webdriver #引入ActionChains类 提供了鼠标的操作方法 from selenium.webdriver.common.action_cha ...
- Python&Django学习系列之-激活管理界面
1.创建你个人的项目与APP 2.填写你的数据库名称与数据库类型,这里使用内置的sqllite3 3.修改setting文件 a.将'django.contrib.admin'加入setting的IN ...
- wpf 依赖属性注册解释
这个解释的很明白了 http://www.cnblogs.com/xiongpq/archive/2010/06/29/1767905.html
- 拉登是我罩的队_第三周_需求改进&原型设计
需求改进&原型设计 1. 需求&原型改进 1.1硬件部分(1) 硬件部分分为主机和遥控器,分别由两个单片机进行控制.(2) 单片机1:负责显示游戏的界面.使用数码管显示当前得分,使用不 ...
- 桥梁(Bridge)模式
桥梁(Bridge)模式:桥梁模式是一个非常有用的模式,也是比较复杂的一个模式.熟悉这个模式对于理解面向对象的设计原则,包括"开-闭"原则(OCP)以及组合/聚合复用原则(CARP ...
- utf-8是否带签名 乱码问题。
Encoding utf8 = new UTF8Encoding(true); 参数表示是否带签名, 但此是否带签名在WriteAllBytes 无效,生成的永远是无签名的. 但在WriteAllTe ...
- 使用Linq读取资源文件
ResXResourceReader resxr = new ResXResourceReader(txt_WebResourceOpenFile.Text); IEnumerable<Dict ...