寒假总结 1-13

又当了一天废物

kkksc03考前临时抱佛脚 - 洛谷

 暴力搜索,记得标记

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<malloc.h>
int min=0,tip=0;
void find(int num[30][2],int allb,int n,int add);

int main(){
	int a[4],num[30][2];
	for(int i=0;i<4;i++){
		scanf("%d",&a[i]);
	}
	int end=0;
	for(int ss=0;ss<4;ss++){
		int all=0;
		if(a[ss]==1){
			scanf("%d",&all);
			end+=all;
		}
		else if(a[ss]==2) {
			scanf("%d%d",&num[0][0],&num[1][0]);
			all=num[0][0]>num[1][0]?num[0][0]:num[1][0];
			end+=all;
		}
		else{
			memset(num,0,sizeof(num));
			for(int i=0;i<a[ss];i++){
				scanf("%d",&num[i][0]);
				all+=num[i][0];
			}
			int allb=all/2;
			min=0;tip=0;
			find(num,allb,a[ss],0);
//			printf("\n*%d\n\n",all-min);
			end+=all-min;
		}
	}
	printf("%d",end);
	return 0;
}

void find(int num[30][2],int allb,int n,int add){
	if(tip==0){
		for(int i=0;i<n;i++){
			if(num[i][1]==0){
				add+=num[i][0];
				if(add>allb) {add-=num[i][0];continue;}
				else if(add==allb){tip=1; min=add;return;}
				else{
					num[i][1]=1;
					if(add>min)min=add;
					find(num,allb,n,add);
					num[i][1]=0;
					add-=num[i][0];
				}
			}
		}
	}
}

[NOIP2000 提高组] 单词接龙 - 洛谷

一下午加晚上都搭在这上面了,搞到12点半。。。

开始的时候是输入明显有问题,自己用样例和套出来的数据点2 ,3在本机上都挂了,找讨论版看到了出错了 - 洛谷得到了解决办法:

 但是还是只过了前两个数据点

后面检查代码,发现写的标记次数的tip[20]在搜索里面减次数的时候变成了tip--而不是tip[i]--,结果出大问题,改完之后只有第四个数据点没过了

这个数据点最长是9,necessary,而我当时写的代码优先判断当前字符串有没有尾巴可以匹配下一个字符串,没有就跳出,结果搜索出来的是name+ever,长度只有7,增加了一个判断大小语句之后过了

 

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<malloc.h>

int bj(char a[100],char b[100],int ll);
int lip=0;
void find(int n,int l[22],int id[22][22],int tip[22],int lastid,int imal);

int main(){
	char z[22][100];
	int l[22]={0},tip[22]={0},id[22][22]={0};
	int n;scanf("%d",&n);getchar();
	for(int i=0;i<n;i++){
		scanf("%s",z[i]);
		l[i]=strlen(z[i]);//输入,取得长度
	}
	char op[2];scanf("%s",op);getchar();
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
				id[i][j]=bj(z[i],z[j],l[i]);//比较函数,对每个字符串进行比较,看有没有尾巴与头能够相连接的
	}	}
	for(int i=0;i<n;i++){
		if(z[i][0]==op[0]) {
			tip[i]++;
			if(l[i]>lip)lip=l[i];
			find(n,l,id,tip,i,l[i]);
			tip[i]--;
		}
	}
/*	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			printf("%d\t",id[i][j]);
		}printf("\n");
	}*/
	printf("%d",lip);
	return 0;
}

int bj(char a[100],char b[100],int ll){
	int end=0;
	for(int i=1;i<ll;i++){
		int tp=0;
		while(a[tp+i]==b[tp])tp++;
		if(a[tp+i]=='\0'&&b[tp]!='\0')end=tp;
//		printf("%d\t",end);
	}
//	printf("\n");
	return end;
}

void find(int n,int l[22],int id[22][22],int tip[22],int lastid,int imal){
	for(int i=0;i<n;i++){
		if(tip[i]<2&&id[lastid][i]>0){
			tip[i]++;
//			for(int ss=0;ss<n;ss++) printf("%d\t",tip[ss]);printf("\n");
//			printf("%d %d\n",lastid,i);
			if(lip<imal+l[i]-id[lastid][i])lip=imal+l[i]-id[lastid][i];
//			printf("%d\n",lip);
			find(n,l,id,tip,i,imal+l[i]-id[lastid][i]);
			tip[i]--;
		}
	}
}

[USACO11OPEN]Corn Maze S - 洛谷

 属于是重写都解决不了的问题了,不做了,开摆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值