B 咕咕東想吃飯(貪心演算法)

2021-10-03 20:35:30 字數 2158 閱讀 3274

咕咕東考試周開始了,考試周一共有n天。他不想考試周這麼累,於是打算每天都吃頓好的。他決定每天都吃生煎,咕咕東每天需要買aia_iai​個生煎。但是生煎店為了刺激消費,只有兩種購買方式:

①在某一天一次性買兩個生煎。

②今天買乙個生煎,同時為明天買乙個生煎,店家會給乙個券,第二天用券來拿。

沒有其餘的購買方式,這兩種購買方式可以用無數次,但是咕咕東是個節儉的好孩子,他訓練結束就走了,不允許訓練結束時手裡有券。咕咕東非常有錢,你不需要擔心咕咕東沒錢,但是咕咕東太笨了,他想問你他能否在考試周每天都能恰好買aia_iai​個生煎。

輸入格式

輸入兩行,第一行輸入乙個正整數n(1<=n<=100000)(1<=n<=100000)(1<=n<=100000),表示考試周的天數。

第二行有n個數,第i個數ai(0<=ai<=10000)a_i(0<=a_i<=10000)ai​(0<=ai​<=10000)表示第i天咕咕東要買的生煎的數量。

輸出格式

如果可以滿足咕咕東奇怪的要求,輸出"yes",如果不能滿足,輸出「no」。(輸出不帶引號)
樣例輸入1

4

1 2 1 2

樣例輸出1

yes
樣例輸入2

3

1 0 1

樣例輸出2

no
資料規模

資料點 	n(上限) 	aia_iai​(上限)

1,2 10 10

3,4,5 1000 10

6,7 10 10000

8,9,10 100000 10000

選用貪心演算法,想要每天吃到一定數量的生煎,那麼某天如果要吃偶數個生煎,就全選方案1,奇數個,選方案二,原因是什麼呢?

因為本題目的是考察某種安排是否能夠實現,並不需要求最優解或者其他。

同時,安排是否能實現,只與每天生煎數的奇偶有關,若想讓乙個奇數變偶,1足夠了,2、4、6等偶數反而沒用,3、5、7等奇數和1效果是一樣的(如果1不行,3、5、7等也不行)。

所以,出現了上述貪心策略,而不需要去遍歷所有可能性(這樣的dfs相當於根本沒有剪枝)。

一開始在csp模考中,我想的演算法是dfs搜尋(以前都沒有根據資料判斷演算法可不可用的意識),結果顯然超時,所以這個**不一定對,因為只是前幾個點ac,後面可能有錯誤沒機會報出來。

//dfs方法 資料太多 會超時 

#include

#include

using

namespace std;

int n=0;

vector<

int>a(

0);int flag=0;

void

solution

(int i,

int num)

if(i==n-1)

else

}else

}return;}

intmain()

solution(0

,a[0])

;if(flag==1)

else

return0;

}

之後一直超時,詢問學長才知道,一看這個資料規模就應該排除搜尋…

所以本題選用的是貪心演算法。

#include

//貪心演算法

intmain()

for(

int i=

0;i)else

}else

else}}

if(flag==1)

else

return0;

}

一定一定!!想演算法前要先看資料規模!資料規模很大的,絕對不要想n^2及以上時間複雜度的演算法!dfs、bfs不進行記憶性剪枝,更不要想!

看待問題一定要更深層次!不能看完表面,就想演算法,就開始實現。演算法最根本,演算法如果錯了,後續所有實現都是在做無用功。

B 咕咕東想吃飯

一共有n天,每天買生煎,每天需要買ai個生煎。但是生煎店為了刺激消費,只有兩種購買方式 在某一天一次性買兩個生煎。今天買乙個生煎,同時為明天買乙個生煎,店家會給乙個券,第二天用券來拿。沒有其餘的購買方式,這兩種購買方式可以用無數次。問能否在n天內每天都能恰好買ai個生煎。第一行輸入乙個正整數n。第二...

咕咕東想吃飯

咕咕東考試周開始了,考試周一共有n天。他不想考試周這麼累,於是打算每天都吃頓好的。他決定每天都吃生煎,咕咕東每天需要買a ia i ai 個生煎。但是生煎店為了刺激消費,只有兩種購買方式 在某一天一次性買兩個生煎。今天買乙個生煎,同時為明天買乙個生煎,店家會給乙個券,第二天用券來拿。沒有其餘的購買方...

咕咕東想吃飯

咕咕東考試周開始了,考試周一共有n天。他不想考試周這麼累,於是打算每天都吃頓好的。他決定每天都吃生煎,咕咕東每天需要買ai個生煎。但是生煎店為了刺激消費,只有兩種購買方式 在某一天一次性買兩個生煎。今天買乙個生煎,同時為明天買乙個生煎,店家會給乙個券,第二天用券來拿。沒有其餘的購買方式,這兩種購買方...