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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

poj - 3262 貪心,從n=2時(shí)的特殊情況推出n>=2通解的思想

2019-11-10 23:02:02
字體:
供稿:網(wǎng)友

poj-3262

貪心 水題

n頭牛,每頭牛每分鐘造成d的破壞,把它趕回牛欄需要t的時(shí)間 問按什么順序去趕牛最終破壞最小

思路:先考慮兩頭牛的情況,t1,d1和t2,d2 先趕1,破壞:2*t1*d2,先趕2,破壞:2*t2*d1(農(nóng)夫還要回來所以要乘以2) 所以只需要比較t1*d2和t2*d1的大小就可以判斷趕的順序 比較函數(shù)為bool cmp(P a, P b) {return a.t*b.d < b.t*a.t; }

當(dāng)n>2的時(shí)候,這個(gè)函數(shù)也適用 試想如果趕牛的順序中有兩頭牛的順序不符合上面的方式,那么,我們只要將這兩頭牛的順序調(diào)換過來,最后的破壞就會(huì)小一些,所以必須要所有牛的順序都符合,最后結(jié)果才是最小

還做過另一題類似的,兩組數(shù)字,每組n個(gè),記作ai,bi 每次從兩組數(shù)字中各選一個(gè)數(shù)字,將它們相乘,將所有結(jié)果相加,如何的到最大結(jié)果 思路也是從n=2的時(shí)候開始考慮, 結(jié)果是:a1*b1+a2*b2或a1*b2+a2*b1 只需要比較兩者大小 將兩者相減: a1*b1+a2*b2-a1*b2-a2*b1 = a1*(b1-b2) - a2*(b1-b2) = (a1-a2)*(b1-b2) 顯然,要得到最大值,兩組數(shù)字必須是相通的順序,從小到大或者從大到小排序 同樣的,可以推廣到n>=2的時(shí)候

注意int會(huì)溢出,要用long long

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;typedef long long ll;const int MAXN = 100000 + 100;int n;struct P {int t, d; };bool cmp(const P &a, const P &b){ return a.t*b.d < b.t*a.d;}P p[MAXN];int main(){ while(scanf("%d", &n) == 1) { ll d = 0; for(int i=0; i<n; i++) scanf("%d%d", &p[i].t, &p[i].d), d+= p[i].d; sort(p, p+n, cmp); ll ans = 0; for(int i=0; i<n; i++) { d-=p[i].d; ans+=p[i].t*2*d; } cout << ans << endl; } return 0;}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长海县| 山东省| 赤城县| 明光市| 金溪县| 汾阳市| 潢川县| 读书| 沁阳市| 孙吴县| 长垣县| 阿拉善盟| 应用必备| 安泽县| 蛟河市| 嘉祥县| 修水县| 延吉市| 进贤县| 囊谦县| 嘉鱼县| 普兰店市| 苍溪县| 邢台县| 常熟市| 武威市| 隆化县| 车险| 纳雍县| 外汇| 吉林省| 西城区| 永寿县| 紫金县| 方城县| 邵阳县| 德格县| 双江| 木兰县| 孝义市| 同心县|