国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

POJ 3040 Allowance 貪心

2019-11-11 01:27:15
字體:
來源:轉載
供稿:網友

題目鏈接: poj 3040

貪心 看到題目的時候完全沒有什么思路,這類題目做的還是太少了,完全是面向題解編程。

我的(bierende)思路:第一時間肯定是想到浪費的越少越好。 1. 當幣值大于C的時候,就直接用這個硬幣付工資。 2. 當幣值小于C的時候,就要想一種搭配方案,使得總的價值等于或者多于C但多余的錢要盡可能少,這個就比較難想到了。

而題目中有一個條件是,大的幣值能被小的整除,所以若干個小的一定能湊出大的,那么可以用一個大的或若干個小的的情況下,肯定是要選用一個大的,這樣之后的搭配方案才能更好的符合”超出C的錢盡可能少“這個條件。

所以, 當當幣值小于C的時候,從幣值最大的開始遍歷,一個小于C,那兩個、三個一直到n個,直到剛好等于C或者n+1個硬幣大于C,如果是后者,那就選n個,在從幣值更小的硬幣重復上面的過程,直到剛好等于C或者全部硬幣遍歷完 如果最后的全部遍歷完還是不能湊到剛好等于C,那么從小到大,直到找到一個加上這個硬幣剛好大于C的。如果找不到,就說明剩下的全部加起來已經沒有C了,結束了

#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>using namespace std;const int MAXN = 25;pair<int,int> p[MAXN];//存儲硬幣幣值和數量int n, c;int main(){ while(scanf("%d%d", &n, &c) == 2) { for(int i=0; i<n; i++) scanf("%d%d", &p[i].first, &p[i].second); sort(p, p+n);//按幣值從小到大排序 int ans = 0, require, need[MAXN], rest; while(true) { rest = c; memset(need, 0, sizeof(need)); for(int i=n-1; i>=0; --i)//從大到小選擇 { if(p[i].second>0) { require = min(p[i].second, rest/p[i].first);//需要這個幣值的硬幣的數量 rest -= require*p[i].first; need[i] = require; } if(rest == 0) break;//剛好湊出C } if(rest) { for(int i=0; i<n; i++)//從小到大選擇 { if(p[i].second && p[i].first>=rest)//加上這個硬幣(最小)就剛好大于C { rest = 0; need[i]++; break; } } } if(rest) break;//兩輪選擇后仍然湊不齊C,結束 int week = 1e8;//用這個方案能發多少個星期的工資 for(int i=0; i<n; i++) { if(need[i]) week = min(week, p[i].second/need[i]); } ans+=week; for(int i=0; i<n; i++)//把用掉的硬幣減去 { if(need[i]) p[i].second -= week*need[i]; } } cout << ans << endl; } return 0;}
上一篇:一個有意思的問題

下一篇:異常(二)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 淳化县| 南岸区| 都兰县| 翁牛特旗| 余庆县| 合水县| 福清市| 涿州市| 龙江县| 江阴市| 兴城市| 抚远县| 行唐县| 盘山县| 诸暨市| 嵊州市| 错那县| 龙岩市| 礼泉县| 松滋市| 台山市| 迁安市| 衡水市| 沁阳市| 四会市| 湘阴县| 紫金县| 泗水县| 罗田县| 安溪县| 宽甸| 德昌县| 富裕县| 墨脱县| 普安县| 扎鲁特旗| 贵溪市| 武平县| 诸暨市| 兴化市| 无极县|