http://acm.hdu.edu.cn/showproblem.php?pid=5600php
本文重在分析該題目的思路,代碼極其短,可是想到這個題目的思路倒是挺複雜的過程。ios
本身拿到題目也想到了不少,用了一些小的樣例去找尋一些規律,可是仍是沒有徹底找到方法。 這個題目中重要的一點是你要能發現操做次數個數與N的奇偶的規律,(N是電燈的個數)N是奇數,操做次數必定是奇數,N是偶數,操做次數是偶數。 那麼這幅圖能夠直觀的理解上面這個結論。c++
下面你還能夠獲得一個結論,若是我要是的全部的燈所有熄滅的話,1要變0,0還得是0,1的操做次數必定是奇數次,0的操做次數必定是偶數次。 咱們能夠獲得下面這個公式web
因此咱們毫無疑問地要說,若是1的個數的奇偶關係與N的奇偶不一樣那麼它必定不能夠所有熄滅。spa
接下來,若是1的個數與N的個數奇偶相同,那0的個數是必定是偶數,那麼也就是說在整個序列裏,0能夠兩個兩個的取,回到以前找規律時發現的一個重要特色:咱們發現當咱們從1走到i時,假設咱們往回走到左邊某個點k,再走回來i,那麼你會發現有且僅有k和i這兩個數至關於沒有操做(由於走了偶數次)。也就是說咱們能夠每次任意選擇這個序列裏的兩個0做爲沒有操做,然而不需操做的0的個數剛好是偶數個。code
見下圖blog
代碼string
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int main() 7 { 8 int t,n,num,c; 9 scanf("%d",&t); 10 while(t--) 11 { 12 scanf("%d",&n); 13 c = 0; 14 for(int i = 1;i<=n;i++) 15 { 16 scanf("%d",&num); 17 if(num==1) 18 c++; 19 } 20 if((c%2)==(n%2)) 21 printf("YES\n"); 22 else 23 printf("NO\n"); 24 } 25 return 0; 26 }