这题目的贪心思路还是有一点细节问题的。

还没有证明,据说是因为题目给的条件是每个价格是比它小的价格的倍数才能这么贪心的。

思路如下:

假设要给奶牛的钱为C

1)从大面值到小面值一次拿钱,能拿多少拿多少。

但是注意不能拿到的钱的总和大于C

2)如果第一步拿到的钱不够C,那么就从小面值到大面值拿钱,能拿多少拿多少。

直到拿到的钱总和大于等于C

我刚开始第一步实现的比较好,但是第二步想错了。

后来才意识到大拿到的钱尽量不要超过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[22];
int use[22], sum[22];
int main()
{
scanf("%d%d", &n, &c);
for(int i = 0; i < n; i++) scanf("%d%d", &a[i].first, &a[i].second);
sort(a, a + n);
int ans = 0;
for(int i = n - 1; i >= 0; i--)
if(a[i].first >= c)
{
ans += a[i].second;
a[i].second = 0;
}
while(true)
{
int flag = 0;
int tmp = c; memset(use, 0, sizeof(use));
for(int i = n - 1; i >= 0; 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 <= 0)
{
flag = 1;
break;
}
}
if(tmp > 0)
{
for(int i = 0; i < n; i++)
if(a[i].second > use[i])
{
while(use[i] < a[i].second)
{
tmp -= a[i].first;
use[i]++;
if(tmp <= 0)
{
flag = 1;
break;
}
}
if(tmp <= 0) break;
}
}
if(!flag) break;
int mx = INF;
for(int i = n - 1; i >= 0; i--)
if(use[i]) mx = min(mx, a[i].second / use[i]);
ans += mx;
for(int i = n - 1; i >= 0; i--)
if(use[i]) a[i].second -= mx * use[i]; }
printf("%d\n", ans);
return 0;
}

POJ 3040 Allowance 贪心的更多相关文章

  1. POJ 3040 Allowance【贪心】

    POJ 3040 题意: 给奶牛发工资,每周至少 C 元.约翰手头上有面值V_i的硬币B_i个,这些硬币的最小公约数为硬币的最小面值.求最多能发几周? 分析: 贪心策略是使多发的面额最小(最优解).分 ...

  2. poj 3040 Allowance

    Allowance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1842   Accepted: 763 Descript ...

  3. 【贪心】Allowance POJ 3040

    题目链接:http://poj.org/problem?id=3040 题目大意:你有n种不同面值的硬币,面值为vi的有bi个."硬币的面额均匀地分配下一个更大的面额",即下一个更 ...

  4. 【POJ - 3040】Allowance(贪心)

    Allowance 原文是English,这里就放Chinese了 Descriptions: 作为创纪录的牛奶生产的奖励,农场主约翰决定开始给Bessie奶牛一个小的每周津贴.FJ有一套硬币N种(1 ...

  5. POJ 3040 贪心

    贪心好题 ---. 思路: 从大到小凑C 如果不够 再从小到大补满(超过)C //By SiriusRen #include <cstdio> #include <cstring&g ...

  6. Greedy:Allowance(POJ 3040)

    零用钱大作战 题目大意:农夫和牛又搞新花样了,现在农夫想给Bessie每个星期都给一点零用钱,农夫有一堆面值的钱币,并且这个钱币都能被上一个钱币整除(1,5,10,50),并且钱币有一定数量,要你求最 ...

  7. poj-3040 Allowance (贪心)

    http://poj.org/problem?id=3040 FJ 有n种不同面值的硬币,每种硬币都有相应的个数,大面值的硬币值总能被小面值的硬币值整除,每周需要支付 Bessie   c元,问最多能 ...

  8. POJ 1456(贪心)

    #include <string.h> #include <iostream> #include <queue> #include <stdio.h> ...

  9. poj -3614 Sunscreen(贪心 + 优先队列)

    http://poj.org/problem?id=3614 有c头奶牛在沙滩上晒太阳,每头奶牛能忍受的阳光强度有一个最大值(max_spf) 和最小值(min_spf),奶牛有L种防晒霜,每种可以固 ...

随机推荐

  1. Android-onInterceptTouchEvent()和onTouchEvent()总结

    老实说,这两个小东东实在是太麻烦了,很不好懂,我自己那api文档都头晕,在网上找到很多资料,才知道是怎么回事,这里总结一下,记住这个原则就会很清楚了: 1.onInterceptTouchEvent( ...

  2. Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换

    t使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec类 ...

  3. Integer ==与Equals【原创】

    package Equals; public class IntegerEquals { public static void main(String[] args) { printLine(128) ...

  4. Android Branch and master source code merge(patch)

    Environment : Android 4.4.2 merge with Android 4.4.3(with other vendors source code) 1.确定你要merge 到 其 ...

  5. java对象占用内存大小计算方式

    案例一: User public class User { } UserSizeTest public class UserSizeTest { static final Runtime runTim ...

  6. java运行脚本语言demo

    public class Test { /** * @param args * @throws IOException  */ public static void main(String[] arg ...

  7. ASP.NET - Eval数据绑定

    <!--新闻分类--> <div id ="category" class ="Frm"> <h4>新闻分类</h4& ...

  8. os内存使用管理之unix-AIX篇

    os内存使用管理之unix-AIX篇 未完待补充.....

  9. 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...

  10. OpenCV Python教程(3、直方图的计算与显示)

    转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...