又当了一天废物
暴力搜索,记得标记
#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];
}
}
}
}
}
一下午加晚上都搭在这上面了,搞到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]--;
}
}
}
属于是重写都解决不了的问题了,不做了,开摆