HDU 3363--贪心
来源:互联网 发布:淘宝皇冠转让 编辑:程序博客网 时间:2024/06/07 17:53
题意:
给一个数字n,之后给出一个长度是n的字符串,字符串仅由H和T两个字母组成,将该字符串进行切割,问如何切割才能保证H和T等分
输入:
4
HHTT
4
HTHT
4
HHHT
0
输出:
2
1 3
1
2
-1
分析:
如果能将H和T进行等分,就说明H和T的数量是相同的,因此只需要看一个就可以,我们不妨看H,这个很关键。如果H的数量是奇
数,那么无法将该字符串进行得分,所以这种情况下输出-1即可。如果可分割,我们只需要找到子字符串的H的数量等于总字符串的
H的数量的地方,切开即可。所以我们先统计H的数量,并且将H的数量储存起来,如果在字符串的中间处统计的H的数量等于H总数
量的一半,切割位置就是n/2;如果中间位置的H 的数量少于字符串的H的总数量,只可能是这种情况,那么就从字符串的中间位置开
始,直到找到H的数量满足字符串总数量的一半的位置,于是在该位置切一刀并且在前半段对应的 位置也切一刀,这样就好了。
数量对称切一刀,否则切两刀。
代码:
#include <bits/stdc++.h>using namespace std;const int maxn=100000+10;char str[maxn];int hn[maxn];int main(){ int n,h; while(scanf("%d",&n)==1&&n) { scanf("%s",str); if(n%2!=0) { printf("-1\n"); continue; } h=0; for(int i=0; i<n; ++i) { if(str[i]=='H') ++h; hn[i]=h; } if(h%2!=0) { printf("-1\n"); continue; } if(hn[n/2-1]==h/2) //对称 { printf("1\n%d\n",n/2); continue; } for(int i=1; i<n/2; ++i) { if ((hn[i+n/2-1]-hn[i-1])==h/2) //直到找到H的个数是H总个数的一半为止,最多切两刀 { printf("2\n%d %d\n",i,i+n/2); break; } } } return 0;}
0 0
- HDU 3363--贪心
- HDU 贪心
- 【贪心】hdu
- HDU 2111 Saving HDU(贪心)
- HDU 2111贪心--【Saving HDU】
- HDU 2111 Saving HDU (贪心)
- HDU Saving HDU (贪心)
- HDU 2111 Saving HDU【贪心】
- 【HDU 2111】Saving HDU(贪心)
- HDU.2111 Saving HDU(贪心)
- hdu 1257 dp+贪心
- HDU 1257 DP + 贪心
- hdu pie(二分+贪心)
- hdu 2037 贪心
- 【贪心】hdu 2863
- HDU 4023 贪心+博弈
- 【贪心】HDU 4137
- HDU-1009 贪心
- linux 网络编程之服务器多线程限制
- hdu 2239 Selecting Courses(二分图最大匹配)
- ObjectAnimator之android:propertyName
- 基于UAAG2.0 Reference的移动无障碍案例(一)
- HDU 2199 Can you solve this equation?(二分)
- HDU 3363--贪心
- 234. Palindrome Linked List
- 主流PHP框架之间的比较
- 欢迎使用CSDN-markdown编辑器
- Hdu1248 寒冰王座
- Codeforces 435A Queue on Bus Stop
- 278. First Bad Version
- PRML学习
- 欢迎使用CSDN-markdown编辑器