BIT pp-2018 定情礼物(绿一半。。。。。)

本文介绍了一种基于C语言实现的算法,该算法用于解决从项链两端收集同颜色珠子的问题,特别关注处理以特定字符开头的情况。通过分析项链字符串,算法能够找到收集最多相同颜色珠子的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
参与者从项链的某处将它截断拉直;接着从一端向另外一端收集同颜色的珠子,直到碰到一个不同
颜色的珠子为止;然后再从另外一端做同样的操作。(一端收集的珠子颜色可以不同于另一端的)
*/ 

/*
问题:w开头如何处理?
*/ 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int count();
int W_head();

int turn(char ch[], int t, int flag)
{
	if( (flag==1) && (t==strlen(ch)) )/*右端末端,回到头部*/
		t=0;
	if( (flag==-1) && (t<0) )/*左端末端,回到尾部*/ 
		t=strlen(ch)-1;
	return t;
}
int W_head(char ch[], int wa, int flag)/*如果首位为w*/
{
	char headx=ch[wa];
	int ws=0;
	if(headx=='w' || headx=='W')
	{
		int ix=wa; 
		while( ch[ix]=='w' || ch[ix]=='W')
		{
			ws++;
			ix+=flag;
			ix=turn(ch, ix, flag);
		}
	}
	return ws;
}

int count(char arr[], int cut)/*cut为切片处右边第一个*/
{
	/*printf("这里是count===》》》%d\n",cut);*/
	int right=0, left=0;
	int flag=1;
	if (flag==1)/*往右*/
	{
		int w=W_head(arr, cut, flag);/*判断头部为w的情况*/
		char head=arr[cut+w];
		int i=cut + w;
		right+=w;
		
		while(arr[i]==head || arr[i]=='w' || arr[i]=='W')
		{
			right++;
			i++;
			i=turn(arr, i, flag);
			if(i==cut)/*如果整条项链都是,需要这个退出*/
				break;
		}
	}
	
	flag = -1;
	if (flag==-1)/*往左*/
	{
		int w=W_head(arr, cut-1, flag);/*判断头部为w的情况*/
		char head = arr[cut-1-w];
		int j = cut - 1 - w;
		left+=w;
		
		while(arr[j]==head || arr[j]=='w' || arr[j]=='W')
		{
			left++;
			j--;
			j=turn(arr, j, flag);
			if(j==cut)/*如果整条项链都是,需要这个退出*/
				break;
		}
	}
	/*printf("========>>>left+right是:%d\n", left+right);*/
	return left+right; 
} 

main()
{
	int N=0;
	char necklace[355];
	memset(necklace,0,sizeof(necklace));
	while(scanf("%d",&N) != EOF)
	{
		getchar();
		scanf("%s",necklace);
		/*printf("这是necklace===》》》%s\n",necklace);*/
		int cut=0,max=0;
		while( cut < strlen(necklace) )
		{
			int sum=count(necklace,cut);
			max=( max<sum ? sum:max );
			/*printf("它的max是:%d\n",max);*/
			cut++;
		}
		printf("%d\n",max);
	}
	return 0;
}
/*
wwwbbrbwrwrrb
*/

改了好久,最后发现往左时cut少减一,提交却只绿了一半,结果错误,还有一个超时

学艺不精啊。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值