首页 > 代码库 > USACO Broken Necklace

USACO Broken Necklace

这么个所谓简单的题目弄了一下午加一晚上,呵呵,怎么也算不对。

一定会有一个简单的方法。

晚上去新都回来后,又坐在电脑面前思索这个问题。

多次删除写出的眼看就要成功的代码,因为不够简洁。

突然顿悟:

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: qq104801LANG: CTASK: 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);}

 

USACO Broken Necklace