hdu 5600 N bulbs 想法+奇偶討論

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 }
相關文章
相關標籤/搜索