题目来源: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. 使用SharedPreferences接口来实现记住密码功能

    SharedPreferences接口非常适合用来存储零散的数据.这里我们用来实现记录用户名和密码的功能.在前面我用过IO流来实现记住密码的功能.那么用SharedPreferences接口会比用IO ...

  2. Hadoop YARN: 1/1 local-dirs are bad: /var/lib/hadoop-yarn/cache/yarn/nm-local-dir; 1/1 log-dirs are bad: /var/log/hadoop-yarn/containers hdfs硬盘90% yarn unhealthy

    1/1 local-dirs are bad: /var/lib/hadoop-yarn/cache/yarn/nm-local-dir; 1/1 log-dirs are bad: /var/log ...

  3. python之特殊方法

    特殊方法的定义: 1.定义在某些class当中 2.不需要直接调用 3.Python的某些函数或者是操作符会调用相应的特殊方法 特殊方法很多,我们只需要编写用到的特殊方法,以及有关联性的特殊方法. — ...

  4. 百度地图SDK v2.1.2使用方法

    1.开发工具 Android开发工具有很多,开发者可根据自己的喜好进行选择.在此,我们推荐开发者使用Eclipse作为自己的开发工具,本套开发指南也是针对Eclipse开发环境下进行编写的. 2.工程 ...

  5. html乱码原因与网页乱码解决方法

    造成html网页乱码原因主要是html源代码内中文字内容与html编码不同造成.但无论是哪种情况造成乱码在网页开始时候都需要设置网页编码. charset编码设置 html网页乱码效果截图 一.乱码造 ...

  6. android 自定义控件之事件

    首先,继承需要扩展的VIEW,然后在里面添加一个自己的事件方法,例如, oniconclick(myinterface pinterface){ minterface = pinterface; } ...

  7. C++ 成员函数前和函数后加const修饰符区别

    博客转载自: https://www.iteblog.com/archives/214.html 分析以下一段程序,阐述成员函数后缀const 和 成员函数前const 的作用 #include< ...

  8. 数字图像处理实验(2):PROJECT 02-02, Reducing the Number of Gray Levels in an Image 标签: 图像处理MATLAB 2017-

    实验要求: Reducing the Number of Gray Levels in an Image Objective To understand how the number of gray ...

  9. 创建Mat对象

    Mat 是一个非常优秀的图像类,它同时也是一个通用的矩阵类,可以用来创建和操作多维矩阵.有多种方法创建一个 Mat 对象. 1.构造函数方法 下面是一个使用构造函数创建对象的例子. 常用的构造函数 2 ...

  10. SDUT 3377 数据结构实验之查找五:平方之哈希表

    数据结构实验之查找五:平方之哈希表 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description 给定的一组 ...