首页 > 其他 > 详细

hdu 5600 N bulbs 想法+奇偶讨论

时间:2016-02-16 23:28:15      阅读:309      评论:0      收藏:0      [点我收藏+]

http://acm.hdu.edu.cn/showproblem.php?pid=5600

本文重在分析该题目的思路,代码极其短,但是想到这个题目的思路却是挺复杂的过程。

思路

自己拿到题目也想到了很多,用了一些小的样例去找寻一些规律,但是还是没有完全找到方法。 这个题目中重要的一点是你要能发现操作次数个数与N的奇偶的规律,(N是电灯的个数)N是奇数,操作次数一定是奇数,N是偶数,操作次数是偶数。 那么这幅图可以直观的理解上面这个结论。

技术分享

下面你还可以得到一个结论,如果我要是的所有的灯全部熄灭的话,1要变0,0还得是0,1的操作次数一定是奇数次,0的操作次数一定是偶数次。 我们可以得到下面这个公式

技术分享

所以我们毫无疑问地要说,如果1的个数的奇偶关系与N的奇偶不同那么它一定不可以全部熄灭。

接下来,如果1的个数与N的个数奇偶相同,那0的个数是一定是偶数,那么也就是说在整个序列里,0可以两个两个的取,回到之前找规律时发现的一个重要特点:我们发现当我们从1走到i时,假设我们往回走到左边某个点k,再走回来i,那么你会发现有且仅有k和i这两个数相当于没有操作(因为走了偶数次)。也就是说我们可以每次任意选择这个序列里的两个0作为没有操作,然而不需操作的0的个数恰好是偶数个。

见下图

技术分享

代码

 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 }

 

hdu 5600 N bulbs 想法+奇偶讨论

原文:http://www.cnblogs.com/fancy-itlife/p/5194043.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!