題 貪心 神似DP NKOJ3102 取數

2021-07-23 21:33:50 字數 2051 閱讀 3315

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...