1. 程式人生 > >暑假集訓Chapter1 貪心

暑假集訓Chapter1 貪心

priority lap 是個 tchar esp 枚舉 求一個 pri 浪費

為什麽要今天寫呢?

明天全力研究Johnson和一些奇奇怪怪的貪心

今天把能寫的都寫了

T3

每個作業有一個學分和一個DDL

在DDL前完成作業可以獲得相應的學分

給出每個作業的學分和DDL

求一個順序使得學分最大

每做一項作業需要一整天

首先 比起一天浪費掉做已經達到DDL的事情

還不如用它來拿學分

於是我們把task按DDL排序

用一個數據結構變量來記錄當前選了幾個task

如果可以繼續選task就選

選不了就找一個分最少的和當前的比一比取大的就行了

人類智慧

技術分享圖片
#include<bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define
x(a) a.first #define y(a) a.second using namespace std; inline int read() { int x=0,f=1;char ch; for(ch=getchar();!isdigit(ch);ch=getchar())if(ch==-)f=-f; for(;isdigit(ch);ch=getchar())x=10*x+ch-0; return x*f; } int n,now; pii s[100010]; priority_queue<pii,vector<pii>,greater<pii> > q;
bool cmp(pii a,pii b){return y(a) < y(b);} int main() { n = read();int ans = 0; for(int i=1;i<=n;i++) { x(s[i]) = read(); y(s[i]) = read(); } sort(s + 1,s + n + 1,cmp); for(int i=1;i<=n;i++) { pii temp = s[i]; if(now < y(temp)) {
++now; q.push(temp); ans += x(temp); } else { pii tmp = q.top();q.pop(); if(x(temp) > x(tmp)){q.push(temp);ans += x(temp);ans -= x(tmp);} else {q.push(tmp);ans += x(tmp);} } } cout<<ans; }
View Code

poj1042釣魚

(fish is me

話說發源於小朋友精心設計的遊戲被電腦組的童鞋們藐殺之後非常不爽,為了表示安慰和鼓勵,VIP999決定請他吃一次“年年大豐收”,為了表示誠意,他還決定親自去釣魚,但是,因為還要準備2013NOIP,z老師只給了他H(1<=H<=16)個小時的空余時間,假設有N(2<=n<=25)個魚塘都在一條水平路邊,從左邊到右編號為1、2、3、。。。、n)。VIP是個很講究效率的孩子,他希望用這些時間釣到盡量多的魚。他從湖1出發,向右走,有選擇的在一些湖邊停留一定的時間釣魚,最後在某一個湖邊結束釣魚。他測出從第I個湖到I+1個湖需要走5*ti分鐘的路,還測出在第I個湖邊停留,第一個5分鐘可以釣到魚fi,以後再每釣5分鐘魚,魚量減少di。為了簡化問題,他假定沒有其他人釣魚,也不會有其他因素影響他釣到期望數量的魚。請編程求出能釣最多魚的數量。

大暴力

枚舉這個人最後走到的湖

把路上的時間減去

每5分鐘選擇魚最多的地方釣

環狀均分紙牌

選擇中位數作為起點

然後用f[i]表示要挪到i+1處的紙牌數量

那麽f[i] = k - a[i] + f[i - 1]

sigma fi就是答案

暑假集訓Chapter1 貪心