2224 雞國福利(kingdom)

2021-10-22 23:58:33 字數 3014 閱讀 1541

題目描述

雞國為了表彰雞國每乙隻雞在過去一年的優秀表現,打算在接下來的 n 天中每天給雞國的乙隻雞發 1 袋或者 2 袋「雞幣」(雞國的通用貨幣)作為福利。國王要求每天來領錢雞互不相同,即來領過錢的雞不能再來,否則將受到嚴厲的處罰。

但聰明的雞國老百姓偵察後發現國王每天發的錢袋子裡面裝的錢數量是不一樣的(同一天的相同),第 i 天發的每一袋錢為 ai元。如果第 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 行乙個整數,表示最多可以讓多少隻雞感到幸福。

樣例輸入

input1:

212

1

input2:

321

23

input3:

641

2121

5

樣例輸出

output1:

2
output2:

3
output3:

3
資料範圍限制

提示sample1:

樣例 1 中,可以讓第 1 天來領錢的第 1 隻雞領 2 元(1 袋),第 2 天來領錢的第 2 隻雞領 2 元(2 袋),最多可以有 2 隻雞感到幸福。

sample2:

樣例 2 中,由於雞國的平均收入為 2 元,所以領 1 元及以下的雞是不會感到幸福。可以讓第 1 天來領錢的第 1 隻雞領 2 元(2 袋),第 2 天來領錢的第 2 隻雞領 2 元(1 袋),第 3 天來領錢的第 3 隻雞領 3 元(1 袋),最多可以有 3 隻雞感到幸福。

sample3:

樣例 3 中,由於雞國的平均收入為 4 元,所以第 1 天,第 3 天,第 5 天來領錢的雞不管領 1 袋錢,或者領 2 袋錢,或者不領都不會感到幸福。可以讓第 2 天來領錢的第 2 隻雞領4 元(2 袋),第 4 天來領錢的第 4 隻雞領 4 元(2 袋),第 6 天來領錢的第 6 隻雞領 5 元(1袋),最多可以有 3 隻雞感到幸福。

題目大意:

求最長不下降子串行,只是加了兩個條件:

加入序列的值必須大於等於m

對於每天的金幣,可選一袋或兩袋。

70分做法(dp):

我們設f[i][j]表示,第i天的金幣選j袋最多可以使多少雞幸福。

動態轉移方程:

f[i][1]=max(f[i][1],f[j][1]+1) (a[i]>=m,a[j]>=m,a[j]<=a[i]);

f[i][1]=max(f[i][1],f[j][2]+1) (a[i]>=m,2倍a[j]>=m,2倍a[j]<=a[i]);

f[i][2]=max(f[i][2],f[j][1]+1) (2倍a[i]>=m,a[j]>=m,a[j]<=2倍a[i]);

f[i][2]=max(f[i][2],f[j][2]+1) (2倍a[i]>=m,2倍a[j]>=m,2倍a[j]<=2倍a[i]);

初始化:

if(a[i]>=m) f[i][1]=1;

if(a[i]*2>=m) f[i][2]=1;

想必大家都知道了這樣的弊端,這樣做會tle。

#include

#include

#include

#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);

using

namespace std;

long

long n,m,a[

1000010

],f[

1000010][

3],maxn=-1

;void

input()

intmain()

maxn=

max(maxn,

max(f[i][1

],f[i][2

]));

}printf

("%lld"

,maxn)

;return0;

}

100分做法(二分+暴力):

我們用f[i]表示最長不下降的第i個值。

#include

#include

#include

#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);

using

namespace std;

int n,m,a[

1000010

],f[

1000010

],ans=0;

void

input()

intmain()

}}else

//道理同上}}

printf

("%d"

,ans)

;return0;

}

雞國福利 (dp)

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

HRBUST 2224 逆序對數(樹狀陣列)

給定 n 個數組成的陣列,求其逆序對的總數。逆序對定義為,存在 i,j 滿足 i j 且 a i a j 的二元組的數目。第一行包含乙個整數,表示陣列的項數。接下來的一行,包含 n 個數 2 n 100000 依次表示 a i a i 10 9 輸出一行表示對應的答案。1 3 2 5 4 對於乙個從...

AOJ2224(最小(大)生成樹)

題目描述 有很多貓被困在乙個圖中,這些圖由若干點組成,然後給了若干連線,把這個圖分為了幾個區域,請你求出把這個圖消去若干條邊,最後使這個圖沒有封閉區域,請問最小的花費是多少 花費等於邊長總和 思路 一開始並沒有頭緒,後來發現把乙個圖變成乙個沒有封閉區域的圖的最小花費 圖的總權值 最大生成樹的花費 然...