标签:style blog color os io for ar 问题 div
这么个所谓简单的题目弄了一下午加一晚上,呵呵,怎么也算不对。
一定会有一个简单的方法。
晚上去新都回来后,又坐在电脑面前思索这个问题。
多次删除写出的眼看就要成功的代码,因为不够简洁。
突然顿悟:
1.串相联;
假设数数当前位置为pos;
2.k[pos]==‘w‘,不可能是最大。
3.k[pos+1]==‘w‘,不可能是最大。
4.k[pos]=k[pos+1],不可能是最大。
5.pos==0,不能往左数。
所以,
6.只有k[pos]!=k[pos+1]才有可能数出最大:
即‘r‘,‘b‘,或‘b‘,‘r‘这种组合才可能最大。
所以,最后的算法是,找到合适的pos,
从pos往左数+从pos+1往右数这些组合,找出最大的,呵呵!
/*
ID: qq104801
LANG: C
TASK: beads.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* for debug only:counter
*/
void debug_dummy(void)
{
return;
}
int n;
char k[600];
int count(int pos)
{
int index=0;
int l=1,r=1;
if (k[pos]==‘w‘ || k[pos+1]==‘w‘ || k[pos]==k[pos+1] || pos<1)
return 1;
index=pos;
while(--index && index>=0)
{
if ((k[index]==k[pos]) || (k[index]==‘w‘))
l++;
else
break;
}
index=pos+1;
while(++index && k[index]!=‘\0‘)
{
if ((k[index]==k[pos+1]) || (k[index]==‘w‘))
r++;
else
break;
}
//printf("pos:%d l:%d r:%d l+r:%d\n",pos,l,r,l+r);
return l+r;
}
void init()
{
int i;
int cc=0;
char c1,c2;
c1=‘\0‘;
i=n-1;
while(i++)
{
cc++;
k[i]=k[i-n];
if (k[i]!=k[0])
{
c1=k[i];
}
if (c1!=‘\0‘ && k[i]!=c1)
break;
}
k[++i]=‘\0‘;
//printf("cc;%d\n",cc);
//printf("k:%s\n",k);
}
main () {
FILE *fin = fopen ("beads.in", "r");
FILE *fout = fopen ("beads.out", "w");
fscanf(fin,"%d",&n);
fscanf(fin,"%s",&k);
//printf("n:%d\n",n);
//printf("k:%s\n",k);
init();
int i;
int max,t;
t=0;
max=0;
for(i=0;i<n;i++)
{
t=count(i);
if (max<t)
max=t;
}
//printf("max:%d\n",max);
fprintf(fout,"%d\n",max);
fclose(fin);
fclose(fout);
exit (0);
}
标签:style blog color os io for ar 问题 div
原文地址:http://www.cnblogs.com/dpblue/p/3930382.html