您的位置:首页 > 其它

USACO 1.2 Broken Necklace

2018-03-24 20:52 239 查看

USACO 1.2 Broken Necklace

题目

落谷

分析

这是第一道开始有点麻烦的USACO的题目。朴素的想法是模拟数珠子的过程,遍历一边就可以得到最终答案了,但是

有几个坑要考虑好(好像USACO本身设计的案例还是很简单的),比如全白珠子,或是重叠数了白珠子。看了官方解

还有dp的解法,真是orz,先上个人的解,有时间再研究一下官方的。

代码

注释处是debug检查用的

/*
PROG:beads
ID:imking022
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;

int main(void){

ofstream fout("beads.out");
ifstream fin("beads.in");
int n;
fin>>n;

char *cot = (char *) malloc(n*sizeof(char));
for(int i=0;i<n;i++) fin>>cot[i];

int sum, lsum, rsum;
sum = 0;
int be,cur;
char be_bar, cur_bar;
for(int i=0;i<n;i++){
lsum = rsum = 0;

be = (i-1+n)%n;
cur = i;

//      fout<< be<<" "<<cur<<endl;

be_bar = cot[be];
while(be_bar == 'w'){
//          fout<<be_bar<<" ";
be = ((--be)+n)%n;
be_bar = cot[be];
lsum++;
if(lsum == n){
fout<<n<<endl;
return 0;
}
}

while(cot[be]==be_bar || cot[be]=='w' ){
//          fout<<cot[be]<<" ";
be = ((--be)+n)%n;
lsum++;
if(lsum == n){
fout<<n<<endl;
return 0;
}
}

//      fout<<endl;
cur_bar = cot[cur];
while(cur_bar == 'w'){
//          fout<<cur_bar<<" ";
cur = ((++cur)+n)%n;
cur_bar = cot[cur];
rsum++;
if(rsum == n){
fout<<n<<endl;
return 0;
}
}

while(cot[cur]==cur_bar || cot[cur]=='w' ){
//          fout<<cot[cur]<<" ";
cur = ((++cur)+n)%n;
rsum++;
if(rsum == n){
fout<<n<<endl;
return 0;
}
}
sum = (rsum+lsum > sum ? rsum+lsum : sum) ;
}

sum = sum>n? n : sum;
fout<<sum<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  模拟