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( ... 
随机推荐
- js 浮点运算bug
			js几个浮点运算的bug,比如6.9-1.1,7*0.8,2.1/0.3,2.2+2.1 实现思路 通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了 比如:1 ... 
- mysql 使用sleep操作 update 来停止一段时间执行语句  [骚操作]
			update mytestTable inner join(select '2' as id, sleep(5)) a on mytestTable.id=a.id set mytestTable.n ... 
- Sentinel高级
			Sentinel高级 sentinel和springCloud整合 减少开发的复杂度,对大部分的主流框架,例如:Web Servlet.Dubbo.Spring Cloud.gRPC.Spring W ... 
- 【odoo14】第十三章、网站开发(对外服务)
			本章我们将介绍一些关于odoo web服务方面的基础知识.进阶的内容,将在第十四章介绍. odoo中的web请求是由python的werkzeug库驱动的.odoo为了操作方便,对werkzeug进行 ... 
- golang 微服务以及相关web框架
			golang 中国gocn golang Applicable to all database connection pools xorm是一个简单而强大的Go语言ORM库,通过它可以使数据库操作非常 ... 
- 基础篇:JAVA引用类型和ThreadLocal
			前言 平时并发编程,除了维护修改共享变量的场景,有时我们也需要为每一个线程设置一个私有的变量,进行线程隔离,java提供的ThreadLocal可以帮助我们实现,而讲到ThreadLocal则不得不讲 ... 
- 2017-2018 ACM-ICPC Northern Eurasia(A.Archery Tournament)
			题目链接:https://vjudge.net/problem/Gym-101630A 题意: n个事件,t=1 代表增加一个圆心为(x,y),半径为 abs(y)的靶子,t=2,代表射击的坐标为(x ... 
- 利用Navicat premium实现将数据从Oracle导入到MySQL
			背景:我们给用户提供了新的直播系统,但客户之前的老系统用的数据库是Oracle,我们提供的新系统用的是MySQL 客户诉求:将老系统中的所有直播数据导入到MySQL中: 思路:我知道Navicat有数 ... 
- Hashtable 渐渐被人们遗忘了,只有面试官还记得,感动
			尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ... 
- ionic3 清除navpush的堆栈 (android真机返回键bug)
			清除navpush的堆栈可以使用 方法一:ionic3文档 this.navCtrl.popToRoot(); //直接返回根组件 方法二: push 后再删除之前页面即可. this.navCtrl ... 
