USACO 1.1 Broken Necklace (模拟)

本文介绍了一种优化算法,用于解决环形项链中收集特定颜色珠子的问题。通过使用取模操作模拟环状结构,算法在有限时间内最大化收集到的非白色珠子数量。
<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;
}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值