雞國福利 (dp)

2021-08-04 22:21:15 字數 1485 閱讀 6449

雞國為了表彰雞國每乙隻雞在過去一年的優秀表現,打算在接下來的 n 天中每天給雞國的乙隻雞發 1 袋或者 2 袋「雞幣」(雞國的通用貨幣)作為福利。國王要求每天來領錢雞

互不相同,即來領過錢的雞不能再來,否則將受到嚴厲的處罰。 

但聰明的雞國老百姓偵察後發現國王每天發的錢袋子裡面裝的錢數量是不一樣的(同一天的相同),第 i 天發的每一袋錢為 a i 元。如果第 i 天來領錢的雞領 1 袋錢,它可以獲得ai 元的「雞幣」,如果它領 2 袋錢,則可以獲得 2×ai 元「雞幣」,當然它也可以放棄,則第i 天的錢國王收回國庫。 

由於雞國生活條件優越和雞的貪念等原因,當第 i 天領錢的雞同時滿足以下兩個條件時它才會感到幸福: 

(1)領到的錢不能低於雞國的平均收入 m 元。 

(2)要跟它前面領了錢且感到幸福的雞一樣幸福或者更幸福。 

仁慈的國王希望雞國的每乙隻雞都能感到幸福,請你幫國王規劃一下在這 n 天中怎樣給每乙隻發錢才能讓最多的雞感到幸福? 

輸入共 2 行。 

第 1 行輸入兩個整數 n 和 m,分別表示發錢的天數(或理解為來領錢的雞數)和雞國的平均收入。 

第 2 行 n 個正整數 ai  (1≤i≤n),依次表示第 i 天發的一袋錢中的「雞幣」為 ai 元。。 

輸出 1 行乙個整數,表示最多可以讓多少隻雞感到幸福。 

2 1

2 1

2

思路:就是求最長不減子串行的長度。

#include #include #include #include using namespace std;

const int maxn = 2e5 + 5;

int a[maxn],b[maxn],c[maxn],d[maxn],n,m,cnt,ans;

//a表示每天錢袋中的錢數

int lowbit(int k)

void update(int k, int num)}

int query(int k)

return ret;}

int main()

sort(b+1,b+cnt+1);//排序,便於進行二分查詢

cnt = unique(b+1,b+cnt+1) - (b + 1);//去掉重複元素,把重複元素放到陣列尾端,返回非重複下標

m = lower_bound(b+1,b+cnt+1,m) - b; //返回第乙個大於等於m的下標

for(int i = 1; i <= n; i ++)

memset(d,0,sizeof(d));

ans = 0;

for(int i = 1; i <= n; i ++)

if(a[i] >= m)

//兩個if語句不能夠顛倒,如果先查詢更新a[i]的話,則在查詢c[i]的時候求的字首值可能是

//a[i]中得出的,

}printf("%d\n",ans);

}return 0;

}

2224 雞國福利(kingdom)

題目描述 雞國為了表彰雞國每乙隻雞在過去一年的優秀表現,打算在接下來的 n 天中每天給雞國的乙隻雞發 1 袋或者 2 袋 雞幣 雞國的通用貨幣 作為福利。國王要求每天來領錢雞互不相同,即來領過錢的雞不能再來,否則將受到嚴厲的處罰。但聰明的雞國老百姓偵察後發現國王每天發的錢袋子裡面裝的錢數量是不一樣的...

菜雞的DP學習路程 斜率優化

首先先看題。這是一道顯而易見的dp題。我們經過一番思考,就可以得出這道題的dp方程。f i j min 0 k我們著手於狀態優化。狀態高維的原因顯然我們把機子重啟的時間記了下來。我們用預支代價的方法,把狀態從2維降下來。優化後的方程是 f i min 這樣的話,這就是乙個n2的dp 過這道題是綽綽有...

牛飛盤隊(弱雞的DP自我救贖)

題面 老唐最近迷上了飛盤,約翰想和他一起玩,於是打算從他家的n頭奶牛中選出一支隊伍。每只奶牛的能力為整數,第i頭奶牛的能力為r i 飛盤隊的隊員數量不能少於 1 大於n。一支隊伍的總能力就是所有隊員能力的總和約翰比較迷信,他的幸運數字是f,所以他要求隊伍的總能力必須是f的倍數。請幫他 算一下,符合這...