题目来源:http://poj.org/problem?id=1063

题目大意:

  有一种游戏如图所示。一个填满黑白球的转盘,它可以有两种操作,一种是将大转盘顺时针旋转,所有球的位置顺时针挪一位,另一种是转动小转盘,使位于小转盘处的三个小球颠倒位置。游戏的目标是达到下面的图片所示的状态,黑球与白球都处在连续的位置上。

  写一个程序判断给出的球序列是否可能通过上述的两种操作达到目标序列。

输入:第一行为测试用例数T。每个用例第一个数为小球的数目n, 接下来是n个0和1组成的序列,每个数字用空格隔开,0表示白球,1表示黑球。n的值在10到30之间。

输出:如可能达到目标,输出一行“YES”, 否则“NO”


Sample Input

2
18 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 0 1
14 1 1 0 0 1 1 1 0 0 1 1 0 1 0

Sample Output

YES
NO

观察和琢磨上面的两种对于球的操作,我们可以发现,其实规则等价于可以把任意三个相邻的三个球位置颠倒。考虑两种情况:

1. 球的总数为偶数,那么奇数位的球永远到不了偶数位上,反之亦然。

2. 球的总数为奇数,那么任意一个球都可以到达其它任意一个位置上,这种情况下总可以达到目标状态。

  再考虑球总数为偶数时,实际上可以把操作对球颜色顺序的影响分离为对奇数位上球的影响和对偶数位球的影响。我们想象把所有偶数位的球固定,通过旋转可以调换奇数位上相邻的球,通过不断的调换可以把奇数位上黑球调至相邻位置。同样我们可以把偶数位上的黑球调至连续的位置。接下来还要考虑何种情况下才能使整个大转盘上的球可以达到不存在黑白相间的情况。答案是:奇数位上的黑球个数与偶数位上黑球的个数相差不超过1. 这就是球总数为偶数时能达到目标状态的充要条件。

附上两个版本的代码。(直观版和技巧版)

 ////////////////////////////////////////////////////////////////
// POJ1063 Flip and Shift
// Memory: 208K Time : 16MS
// Language : C++ Result : Accepted
//////////////////////////////////////////////////////////////// #include <iostream> using namespace std; int even_black, odd_black;
int buf, cnt; int main(void) {
int T;
cin >> T;
for (int case_id = ; case_id <= T; ++case_id) {
cin >> cnt;
even_black = odd_black = ;
for (int i = ; i < cnt; ++i) {
cin >> buf;
if (buf == ) {
if (i % == ) {
++odd_black;
} else {
++even_black;
}
}
}
if (cnt % ) { //总球数为奇
cout << "YES" << endl;
} else if (odd_black - even_black > || odd_black - even_black < -) {
cout << "NO" << endl;
} else {
cout << "YES" << endl;
}
}
return ;
}
 ////////////////////////////////////////////////////////////////
// POJ1063 Flip and Shift
// Memory: 208K Time : 0MS
// Language : C++ Result : Accepted
//////////////////////////////////////////////////////////////// #include <iostream> using namespace std; int r[];
int buf, cnt; int main(void) {
int T; cin >> T;
for (int case_id = ; case_id <= T; ++case_id) {
cin >> cnt;
r[] = r[] = ;
for (int i = ; i < cnt; ++i) {
cin >> buf;
r[i % ] += buf;
}
cout << (cnt % || r[] - r[] < && r[] - r[] > - ? "YES" : "NO") << endl;
}
return ;
}

POJ1063 Flip and Shift的更多相关文章

  1. zoj 1028 Flip and Shift(数学)

    Flip and Shift Time Limit: 2 Seconds      Memory Limit: 65536 KB This puzzle consists of a random se ...

  2. POJ 1063 Flip and Shift 最详细的解题报告

    题目来源:Flip and Shift 题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起.你可以有以下两种操作: 1.顺时针旋转所有的盘子 2.顺时针旋转3 ...

  3. POJ 1063 - Flip and Shift

    Description This puzzle consists of a random sequence of m black disks and n white disks on an oval- ...

  4. 1254 Flip and Shift

    这题是目的是把黑球和白球分开连续放,事实上只要把其中一种颜色分好在一边就可以,可以绕一个球转即是第n个球可以放在n-2或者n+2上,因为这是个环,所以只需要把黑球或者白球连续放好就可以,当一共有奇数个 ...

  5. POJ题目排序的Java程序

    POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...

  6. POJ题目细究

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  7. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  8. 论文阅读笔记五十五:DenseBox: Unifying Landmark Localization with End to End Object Detection(CVPR2015)

    论文原址:https://arxiv.org/abs/1509.04874 github:https://github.com/CaptainEven/DenseBox 摘要 本文先提出了一个问题:如 ...

  9. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

随机推荐

  1. 问题:C#将base64转换成二进制图片;结果:c# Base64编码和图片的互相转换代码

    c# Base64编码和图片的互相转换代码 Base64编码在Web方面有很多应用,譬如在URL.电子邮件方面.网上有很多相关的资源用于提供Base64编码和其他编码的转换,.Net Framewor ...

  2. js实现导航栏的吸顶操作

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  3. UML在实践中的现状和一些建议

    本文是我在csdn上看到的文章,由于认识中的共鸣,摘抄至此. 原文地址:http://blog.csdn.net/vrman/article/details/280157 UML在国内不少地方获得了应 ...

  4. JAVA基础知识总结8(设计模式)

    设计模式:JAVA中有23种设计模式 1.解决问题最行之有效的思想. 2.是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 3.使用设计模式是为了可重用代码.让代码更容易被他人理解 ...

  5. java中一些常用的英语

     abstract (关键字  ) 抽象  ['.bstr.kt]  access vt.访问,存取  ['.kses]'(n.入口,使用权)  algorithm n.算法  ['.lg.rie ...

  6. HDU 4348(主席树 标记永久化)

    题面一看就是裸的数据结构题,而且一看就知道是主席树... 一共四种操作:1:把区间[l, r]的数都加上d,并且更新时间.2:查询当前时间的区间和.3:查询历史时间的区间和.4:时光倒流到某个时间. ...

  7. Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识

    网站站点的背景调研 1. 检查 robots.txt 网站都会定义robots.txt 文件,这个文件就是给 网络爬虫 来了解爬取该网站时存在哪些限制.当然了,这个限制仅仅只是一个建议,你可以遵守,也 ...

  8. Edison UVALive3488

    传送门 题目大意 有一个0~n-1的序列,有m次操作,操作包含三个元素:pl,len,ti,表示这个操作进行ti次,每次将从pl+1开始的len个元素移到序列头部.分析 看到题不难想到使用平衡树将需移 ...

  9. js获取指定小时日期格式化

    不得不感叹一下,聪明的程序员写的代码真是让人惊奇 找了一圈格式化代码的方式,下面的这个使用了一个 slice 函数,真是厉害 https://stackoverflow.com/questions/4 ...

  10. getBytes()详解.RP

    在java中,getBytes()方法如果不指定字符集,则得到的是一个操作系统默认的编码格式的字节数组:如果指定字符集,则得到的是在指定字符集下的字节数组,如: byte[] b_gbk = &quo ...