您的位置:首页 > 其它

USACO 1.1 Broken Necklace (模拟)

2015-09-09 19:51 295 查看
<pre name="code" class="cpp">#include <stdio.h>
#define DEBUG 0
#define TESTCASES 8

#define LEN_NECKLACE 350
#define MOD(x) ( (x) < 0 ? (x) + numOfBeads : (x) % numOfBeads )//用取模操作来模拟环的技巧真赞

int numOfBeads;
char necklace[LEN_NECKLACE + 1];

int collect(int brokenBead, int direction){
int color = 'w';
int bead = MOD(brokenBead);
int beadsCollected;
for (beadsCollected = 0; beadsCollected < numOfBeads; beadsCollected++){
//colory用来对比的颜色,初始化为白色,遇到非白的珠子便更新为相应的颜色
if (color == 'w' && necklace[bead] != 'w')
color = necklace[bead];
//如果color和要收集的珠子的颜色都非白而且不同颜色,停止收集
if (color != 'w' && necklace[bead] != 'w' && necklace[bead] != color)
break;
bead = MOD(bead + direction);
}
return beadsCollected;
}

int main(){
#if DEBUG
int testCase;
for (testCase = 1; testCase <= TESTCASES; testCase++){
char inputFileName[20] = "necklace.inX";
inputFileName[11] = '1' +  (testCase - 1);
freopen(inputFileName, "r", stdin);
printf("#%d\n", testCase);
#endif

scanf("%d %s", &numOfBeads, necklace);

int maxBeadsCollected = 0;
int beadsCollected = 0;
int lastbead = numOfBeads - 1;
int bead;
for (bead = 0; bead < lastbead ; bead++){
//主循环:往两个方向收集珠子,断点在bead和bead+1之间
beadsCollected = collect(bead, -1) + collect(bead + 1, 1);
if (beadsCollected > maxBeadsCollected)
maxBeadsCollected = beadsCollected;
}

if (maxBeadsCollected > numOfBeads)
maxBeadsCollected = numOfBeads;

printf("%d\n", maxBeadsCollected);

#if DEBUG
}
#endif
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息