nkoj3102 取數
時間限制 : 20000 ms 空間限制 : 165536 kb
問題描述
n個整數組成的乙個環,現在要從中取出m個數,取走乙個數字就不能取跟它相鄰的數字(相鄰的數不能同時取)。要求取出的數字的總和盡可能大,問這個最大和是多少? 如果無解,請輸出「error!」
輸入格式
第一行包含兩個正整數n、m。
第二行為n個整數ai。
輸出格式
僅乙個整數,表示所求結果。如果無解輸出「error!」,不包含引號。
樣例輸入
8 48 5 6 2 3 4 8 9
樣例輸出
25提示
對於全部資料:m<=n;-1000<=ai<=1000
n<=200000
資料編號 n的大小 資料編號 n的大小
1 40 11 2013
2 45 12 5000
3 50 13 10000
4 55 14 49999
5 200 15 111111
6 200 16 148888
7 1000 17 188888
8 2010 18 199999
9 2011 19 199999
10 2012 20 200000
**感謝nodgd修改題目排版
思路:/*
60(70)分,dp(難得寫對,紀念一下)
f[i][j][0]
表示前i個數選j個,不選第j個的max
f[i][j][1]
表示前i個數選j個,選第j個的max
f[i][j][0]=max(f[i-1][j][1],f[i-1][j][0]);
f[i][j][1]=f[i-1][j-1][0]+a[i];
*/100分:
鍊錶儲存,每次選出剩餘點中最大的乙個,刪除左右。
萬一選該點左右兩邊的數更優怎麼辦?
改悔方法:將選出來的點權值修改為num[l]+num[r]-num[id],如果以後又選到這個點了,說明當初選左右兩邊更優,且在選該點的時候已經完成改悔了。
#include#include#includeusing namespace std;
const int need=200003;
#define mp make_pair
#define fi first
#define se second
struct fy w[need];
bool mark[need];
priority_queue> q;
//......nbhb......nbhb......nbhb......nbhb......nbhb......nbhb......nbhb......nbhb......nbhb......nbhb......
inline void in_(int &d)
for(d=0;!(t<'0'||t>'9');t=getchar()) d=(d<<1)+(d<<3)+t-'0';
if(mark) d=-d;
}//......nbhb......nbhb......nbhb......nbhb......nbhb......nbhb......nbhb......nbhb......nbhb......nbhb......
int main()
for(int i=1;i<=n;i++) in_(w[i].num),w[i].l=i-1,w[i].r=i+1,q.push(mp(w[i].num,i));
w[n].r=1,w[1].l=n;
int ans=0,id,num;
while(m)
cout<}
貪心 神槍手問題
題目 薛是乙個神槍手,突然有一天遇到了一群怪物。薛帶著 n 支槍,每支槍的攻擊力為 a i 每個怪物的防禦力為 b j 在滿足 b j a i 的情況下,薛可用 i 槍殺死怪物 j 他會得到 a i b j 的獎金。請記住 每支槍只能用來殺死乙個怪物,而且顯然每個怪物只能被殺死一次。薛想最大化他的獎...
貪心 好題 Yogurt factory
題目 任務規定,乙個酸奶製造廠,在n個星期內,分別要向外提供y i unit的酸奶。已知這個製造廠第i周製造每unit酸奶的費用為c i 儲存室儲存每1unit酸奶1星期的費用為s。問要完成這個任務的最小費用是多少。來自 思路 等價的思路,在第n天的時候,第n 2天製造的酸奶可以看成第n 1天製造的...
貪心(入門簡單題)
有若干個活動,第i個開始時間和結束時間是 si,fi 只有乙個教室,活動之間不能交疊,求最多安排多少個活動?input 第一行乙個正整數n n 10000 代表活動的個數。第二行到第 n 1 行包含n個開始時間和結束時間。開始時間嚴格小於結束時間,並且時間都是非負整數,小於1000000000out...