POJ3040给奶牛发工资
题意:
有n种硬币,每种硬币有mi个,然后让你给奶牛发工资,每周发至少c元(就是不找零钱的意思)然后问你能发几周?(硬币之间都是倍数关系)
思路:
这个题目做了两天,丢脸,看完这个题目我的第一反应就是从大的发起,就是先花面值大的,能大的就一直大的,只要不超过c,然后再能小的就一直小的,补全没超过但是又不够那一部分,这个想法一开始就是对的,只不过我写的时候是排序,然后从前往后取,不能取了再从后往前取。。。这样一直wa,后来无奈了 我看了下题解,卧槽,没错啊(这最蛋疼了,因为我敲题的错误思路和正确思路没冲突,说不清..)结果就一直以为自己姿势不对,然后不停的重新敲,优化优化优化。。还是wa,最后无奈了,直接找了个代码看看,结果...哎! 说下正解吧、
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct
{
int a ,b;
}NODE;
NODE node[25];
bool camp(NODE a, NODE b)
{
return a.a > b.a;
}
int minn(int x ,int y)
{
return x < y ? x : y;
}
int main ()
{
int n ,c ,i ,j;
int need[25];
while(~scanf("%d %d" ,&n ,&c))
{
for(i = 1 ;i <= n ;i ++)
scanf("%d %d" ,&node[i].a ,&node[i].b);
sort(node + 1 ,node + n + 1 ,camp);
int ans = 0 ,l;
for(i = 1 ;i <= n ;i ++)
if(node[i].a >= c) ans += node[i].b;
else break;
if(i == n + 1)
{
printf("%d\n" ,ans);
continue;
}
l = i;
while(1)
{
memset(need ,0 ,sizeof(need));
int s = c;
for(i = l ;i <= n ;i ++)
{
need[i] = minn(node[i].b ,s / node[i].a);
s -= need[i] * node[i].a;
}
if(s > 0)
for(i = n ;i >= l ;i --)
{
if(node[i].b && node[i].a >= s)
{
s -= node[i].a;
need[i] ++;
break;
}
}
if(s > 0) break;
int t = 1000000000;
for(i = l ;i <= n ;i ++)
{
if(need[i])
t = minn(t ,node[i].b / need[i]);
}
ans += t;
for(i = l ;i <= n ;i ++)
if(need[i]) node[i].b -= t * need[i];
}
printf("%d\n" ,ans);
}
return 0;
}
其实这个题目是个不错的贪心题,这个题目我们一定要注意,大硬币一定是小硬币的倍数,这个是关键,首先我们把所有硬币按照面值从大到小排序,比c还大的面值想都不用想,直接就加上硬币个数,然后处理其他的,我们先从大的取,能取多少取多少,就是比如你要取50块钱,然后现在有
面值 30 15 1
个数 2 5 4
这样先取的个数是 1 1 4 一共是 30*1+15*1+1*4=49
剩余个数 1 4 0 距离目标还差1块钱,然后我们在倒着取
1 15 30
0 4 1
在15的地方取一个,然后满足要求了,就行了,这样做是为了保证超出c的部分的钱是最少的,正确性的前提是 硬币之间的倍数关系,还有就是存在优化,就是同样的一次可以同时开出好几周的工资,这个在写的时候自己去想吧,还有这个题目要明确一个问题,就是硬币之间没有什么关系,就是每个硬币只要保证尽量浪费的少就行了。
POJ3040给奶牛发工资的更多相关文章
- poj3040 发工资(贪心)
题目传送门 题目大意:给一个人发工资,给出不同数量不同面额,(大面额一定是小面额的倍数),问最多能发几天,(每天实发工资>=应发工资). 思路:首先,将大于等于c的面额的钱直接每个星期给奶牛一张 ...
- HDOJ2021发工资咯:)
发工资咯:) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDOJ 2021 发工资咯:)(利用了一种取余的思想)
Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵 但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处 ...
- python实现发工资脚本
好开心啊,在旁边大神的帮助下,终于实现了发工资的python脚本,之前用shell写的老出错,刚才测试,发80个人工资详情,妥妥的,代码如下: from email.mime.multipart im ...
- (简单贪心) 发工资咯:) hdu2021
发工资咯:) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU 2021 发工资咯:)
http://acm.hdu.edu.cn/showproblem.php?pid=2021 Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的 ...
- HDU2021发工资咯:)
Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵 但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处 ...
- HDACM2021(发工资)
发工资咯:) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- ACM 超级楼梯 发工资
超级楼梯 有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? Input 输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M( ...
随机推荐
- LightOJ-1074(SPFA判负圈+Bellman-Ford算法)
Extended Traffic LightOJ-1074 这题因为涉及到减法和三次方,所以可能会出现负圈. 这里使用的算法叫做SPFA算法,这个可以用来判负圈和求解最短路.Bellman-Ford算 ...
- MyBatis架构分析
我们都知道Mybatis是一个非常小巧灵活的ORM框架,深受国内广大开发者的喜爱,我们知道它的出现某种程度是为了消除所有的JDBC代码和参数的手工设置以及结果集的封装问题:基于这个一点,我们就可以 ...
- Mark一个代码量统计工具-Statistic
安装方式 IDEA.Goland系列插件市场搜索Statistic 简单说明 统计纬度比较丰富 基本覆盖常见纬度,如代码行数,文件大小等,各指标取最大最小及平均值. 统计目录为当前项目目录 只有在当前 ...
- 代码审查:从 ArrayList 说线程安全
本文从代码审查过程中发现的一个 ArrayList 相关的「线程安全」问题出发,来剖析和理解线程安全. 案例分析 前两天在代码 Review 的过程中,看到有小伙伴用了类似以下的写法: List< ...
- 常用开发库 - 告別BeanUtils拷贝,MapStruct工具库最全详解
常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...
- “/”应用程序中的服务器错误。||分析器错误消息: 未能加载类型“WebApplication1._Default”
环境VS2008 无法运行WEB项目,Winfrom程序OK. 新创建的WEB项目直接运行报下图错误. 尝试多种方法: 1,重新生成项目,运行.(失败) 2,重装VS2008(默认.完全.自定义)安装 ...
- Java8 Stream 中 List 转 Map 问题总结
在使用 Java 的新特性 Collectors.toMap() 将 List 转换为 Map 时存在一些不容易发现的问题,这里总结一下备查. 空指针风险 java.lang.NullPointerE ...
- 攻防世界 reverse android-app-100
android-app-100 suctf-2016 jeb启动,找到点击事件: 验证流程: 输入作为参数 --> processObjectArrayFromNative 得到一返回值(r ...
- java位运算求一个整数的绝对值
1 import java.util.Scanner; 2 3 public class Question1 { 4 public static void main(String[] args) { ...
- 为了效率,我们可以用的招数 之 strlen
如果要你写一个计算字符串长度的函数 strlen,应该怎么写?相信你很容易写出如下实现: 1 int strlen_1(const char* str) { 2 int cnt = 0; 3 4 if ...