题目链接:http://poj.org/problem?id=3040

题目大意:你有n种不同面值的硬币,面值为vi的有bi个。“硬币的面额均匀地分配下一个更大的面额”,即下一个更大的硬币面值是此面值的倍数。你一周需要支付至少c元,没有退钱,每次只能给一周的钱。问最多能支撑几周。

首先对于面值大于c的硬币每个支撑一周。然后从大到小填充c直到填不下或刚好满,如果刚好满就打个标记、ans++。否则从小到大填充直到填满或大于。这里有一个优化,就是每次你配对出来一个方案,可以保存每种用了多少,然后把这些组成一个套装(k为最大目前可用套数),来支撑k个周。

贴代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
int v,b;
friend bool operator <(node x,node y){
return x.v<y.v;
}
}a[25];
int use[25];
int main()
{
int n,c,ans=0;
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].v,&a[i].b);
sort(a+1,a+n+1);
for(int i=n;i>=1;i--)
{
if(a[i].v<c) break;
ans+=a[i].b;a[i].b=0;
}
while(1)
{
bool flag=0;int tmp=c;
memset(use,0,sizeof use);
for(int i=n;i>=1;i--)
{
if(a[i].b==0)continue;
use[i]=tmp/a[i].v;
tmp-=min(use[i],a[i].b)*a[i].v;
a[i].b-=min(use[i],a[i].b);
if(tmp==0){
ans++;flag=1;break;
}
}
if(!flag)
{
for(int i=1;i<=n;i++)
{
if(a[i].b==0)continue;
tmp-=a[i].v;a[i].b--;use[i]++;
if(tmp<0){
ans++;flag=1;break;
}
}
}
if(!flag)break;
int k=100000000,mn;
for(int i=1;i<=n;i++)
if(use[i]){
mn=a[i].b/use[i];
k=min(k,mn);
}
for(int i=1;i<=n;i++)
if(use[i])
a[i].b-=k*use[i];
ans+=k;
}
printf("%d\n",ans);
return 0;
}

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

  1. Greedy:Allowance(POJ 3040)

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

  2. POJ 3040 Allowance【贪心】

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

  3. POJ 3040 Allowance 贪心

    这题目的贪心思路还是有一点细节问题的. 还没有证明,据说是因为题目给的条件是每个价格是比它小的价格的倍数才能这么贪心的. 思路如下: 假设要给奶牛的钱为C 1)从大面值到小面值一次拿钱,能拿多少拿多少 ...

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

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

  5. poj 3040 Allowance

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

  6. POJ 3040 贪心

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

  7. 【贪心】POJ 1065

    头一次接触POJ,然后写了自己比较擅长的贪心. 解题思路大概就是从小排(这个很重要,然后用cmp随便长度或者重量的排序,选择最小的开始) 直到所有比他weight大的,没有符合条件的了.就代表要再加一 ...

  8. 贪心问题 POJ 2393 Yogurt factory

    题目:http://poj.org/problem?id=2393 题意:N周,每周生成牛奶(任意!),每周成本为c_i(1~5000),每周出货 y_i:出货可以使用该周生产的,也可以用之前的储存的 ...

  9. 【贪心】 poj 1032 和为n的若干数最大乘积

    给出n,把n分解为若干不相同数之和,使之乘积最大.贪心,Discuss里面的思路:把n分解为从2开始的连续整数,如果有多,则从高位开始依次加1.如26,我们得到2+3+4+5+6,此时还剩余6(26- ...

随机推荐

  1. Linux下创建Oracle19C的数据库实例

    接上一篇博客,安装 Oracle19chttps://www.cnblogs.com/xuzhaoyang/p/11264557.html 切换到root用户下,切换目录到db_1,执行,遇到选择路径 ...

  2. Python解释器安装与环境变量添加

    Python解释器安装与环境变量添加 Python解释器安装(3.6和2.7): www.python.org这个是python解释器的官网,一定要牢记. 鉴于市场上有两种python版本(2和3), ...

  3. Spring Cloud Zuul路由规则动态更新

    背景  Spring Cloud Zuul 作为微服务的网关,请求经过zuul路由到内部的各个service,由于存在着新增/修改/删除服务的路由规则的需求,zuul的路由规则的动态变更功能 提供了 ...

  4. numpy模块之axis(转)

    转自:https://blog.csdn.net/fangjian1204/article/details/53055219

  5. ASP.NET Core在支付宝小程序中使用signalR

    Github有一个经过重写的微信小程序SignalR的js类库 https://github.com/liangshiw/SignalRMiniProgram-Client 于是我把他改成支付宝小程序 ...

  6. 深入理解JVM(二)--对象的创建

    Java是一门面向对象的语言,在Java程序运行的过程中,无时无刻都会有对象被创建出来,在程序语言中,创建对象(例如克隆,反序列化)通常仅仅是一个new关键字,但是在虚拟机中是怎样的呢?本文主要了解一 ...

  7. 4.linux下配置Golang的环境变量

    装好linux后优先在linux上配置Golang开发环境. 1.到Go语言中文网下载Linux安装包 https://studygolang.com/dl 2.到下载的目录下解压,下载的文件一般在“ ...

  8. dom 页面位置和大小,元素的位置和大小,鼠标位置

    dom里面三种跟位置相关的元素 页面位置和大小,元素的位置和大小,鼠标位置 ①window:位置(position):(screenLeft, screenTop) [(screenX, screen ...

  9. iOS进阶之多线程--NSThread详解

    NSThread简介 NSThread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期.在平时使用很少,最常用到的无非就是 [NSThread cu ...

  10. LeetCode算法01 Valid Parentheses

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...