ZOJ 3894 Chessgame
2015-09-17 14:57
531 查看
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5597
题意:
给出一个长度为n的字符串,B和W分别表示黑棋和白棋。如果白棋旁边有两个黑棋,则可以消去两个黑棋子(BWB),得两分。
同理,如果黑棋子旁边有两个白棋子(WBW),则可以消去两个白棋子,得2分。问最多可以得多少分。
思路:
如果字符串中遇到BBB,WWW,BBBBB这种连续奇数个为相同字母的情况,可以预先处理,因为这种情况最后一定只剩一个B或W。
同理,如果字符串中遇到BBBB,WWWW,WWWWWW这种连续偶数个为相同字母的情况,也可以预先处理,因为这种情况最后一定只剩下2个BB或者两个WW。
所以要考虑的一般情况就是最多只有连续两个相同字母的情况。
如BBWBBWWBBWWBBW。
假设剩下的全部都是连续两个相同字母(除头和尾),如BBWWBBWWBBWW或者BWWBBWWB,那么剩下的一个也不能消去。答案就是总数-剩下的数量。
如果剩下除头和尾中间存在单个的。如BWWBWWBBW。考虑剩下长度的奇偶性。因为预处理是2个2个消,所以剩下长度与n的奇偶性相同,判断n的奇偶性即可。
如果长度为偶数,那么最终肯定会剩下2个,答案是n-2.
如果长度为奇数,那么最终肯定会剩下1个,答案是n-1.
题意:
给出一个长度为n的字符串,B和W分别表示黑棋和白棋。如果白棋旁边有两个黑棋,则可以消去两个黑棋子(BWB),得两分。
同理,如果黑棋子旁边有两个白棋子(WBW),则可以消去两个白棋子,得2分。问最多可以得多少分。
思路:
如果字符串中遇到BBB,WWW,BBBBB这种连续奇数个为相同字母的情况,可以预先处理,因为这种情况最后一定只剩一个B或W。
同理,如果字符串中遇到BBBB,WWWW,WWWWWW这种连续偶数个为相同字母的情况,也可以预先处理,因为这种情况最后一定只剩下2个BB或者两个WW。
所以要考虑的一般情况就是最多只有连续两个相同字母的情况。
如BBWBBWWBBWWBBW。
假设剩下的全部都是连续两个相同字母(除头和尾),如BBWWBBWWBBWW或者BWWBBWWB,那么剩下的一个也不能消去。答案就是总数-剩下的数量。
如果剩下除头和尾中间存在单个的。如BWWBWWBBW。考虑剩下长度的奇偶性。因为预处理是2个2个消,所以剩下长度与n的奇偶性相同,判断n的奇偶性即可。
如果长度为偶数,那么最终肯定会剩下2个,答案是n-2.
如果长度为奇数,那么最终肯定会剩下1个,答案是n-1.
#include <bits/stdc++.h> using namespace std; string s; int T, n; struct Node { char c; int cnt; Node(char cc, int ccnt) { c = cc; cnt = ccnt; } Node(){} }node[210]; int main() { scanf("%d", &T); while(T--) { scanf("%d", &n); cin>>s; int res = 0; for(int i = 0; i < s.size(); i++) { if(i == 0) { res++; node[res].cnt = 1; node[res].c = s[i]; } else { if(s[i] != s[i-1]) { res++; node[res].cnt = 1; node[res].c = s[i]; } else node[res].cnt++; } } bool ifone = false; for(int i = 1; i <= res; i++) { if(node[i].cnt%2) node[i].cnt = 1; else node[i].cnt = 2; } for(int i = 2; i <= res-1; i++) { if(node[i].cnt == 1){ifone = true; break;} } if(ifone) { if(n%2 == 0) printf("%d\n", n-2); else printf("%d\n", n-1); } else { int tot = 0; for(int i = 1; i <= res; i++) tot += node[i].cnt; printf("%d\n", n-tot); } } return 0; }
相关文章推荐
- Android之SurfaceView
- myeclipse从svn检出代码转成maven后格式有误解决方法
- MFC移动控件到指定位置
- 使用if IE语句判断浏览器IE版本及添加升级提示
- Gradle 构建android程序
- 关于数据库,java.lang.IllegalStateException: attempt to re-open an already-closed object
- 实现点击Item可让Item跳到屏幕中间的HorizontalScrollView
- 盒子定位
- 佛祖保佑,从来没有Bug
- 局部变量和全局变量
- 【Python之旅】第二篇(七):集合
- 【Python之旅】第二篇(七):集合
- 心得
- 【设置】PotPlayer播放完毕后停止
- php的错误和异常处理
- java.lang.UnsupportedClassVersionError: Bad version number in .class file异常的处理方法
- android 单击和滚动效果调整
- IPC框架分析 Binder,Service,Service manager
- 01-复杂度1 最大子列和问题
- ContentProvider使用