请教一个C语言问题,求高手指教 40
这是题目Description写下这题目的时间是11.24,美国时间也是11.24,以此题祝远在美帝的PKKJ彭教主生日快乐。生日嘛,自然少不了生日礼物的啦。这天彭教主收...
这是题目
Description
写下这题目的时间是11.24,美国时间也是11.24,以此题祝远在美帝的PKKJ彭教主生日快乐。
生日嘛,自然少不了生日礼物的啦。这天彭教主收到来自中国的一份神秘的生日礼物(传说中是个漂亮的MM o(∩_∩)o 哈哈)。可是礼物却被一个密码锁锁了
起来(pkkj大叫一声:坑爹啊,哪个家伙这么缺德~-_-b)。在礼物箱上还附着一张纸条:嘿嘿~想知道密码吗?那就把下面的题目解出来,答案就是密码啦!
对于一个字符串,定义它的前缀就是指字符串的任意首部。例如字符串abc的前缀有空串,a,ab,abc。
对于一个字符串集合,如果集合中任一个元素都不是其他元素的前缀的话,我们称之为完美非前缀集合。举个例子:{”happy”, “birthday”, “to”,
“pkkj”}就是一个完美非前缀集合,而{“happy”, “hat”, “h”}就不是完美非前缀集合。
现在问题来了,给你一个字符串集合,你要找出一个该集合的子集,使得该子集是一个完美非前缀集合,且包含最多的元素。问你这个完美非前缀子集最多包含
多少个元素?
由于彭教主一心只想着礼物里面的神秘MM,正所谓一心不能二用,所以他想让你帮他来解决这个难题。
Input
第一行只有一个正整数T,表示题目共有T组数据
对于每组数据,输入一个整数n ( 0< n <= 50 ),
接下来有n行,每行输入一个字符串,字符串由小写字母(’a’~’z’)组成,且长度不超过50.
Output
对于每组数据每行输出一个整数,代表一个完美非前缀子集最多包含多少个元素。
Sample Input
2
4
happy
birthday
to
pkkj
4
happy
hat
h
ha
Sample Output
4
2
Hint
对于第一组数据:该集合本身就是一个完美非前缀集合,所以包含最多元素的完美非前缀子集就是它本身,一共有4个元素
对于第二组数据,{”happy”,”hat”}是其中一个的包含最多元素的完美非前缀子集,其元素个数为2
我的思路是:先把字符串排序,然后第一个与后面的字符串比较,是前缀的话个数减一,第二个也是这样,依次类推。。
下面是我写的程序:
#include<stdio.h>
#include<string.h>
main()
{
int i,j,k,T,n,t,max;
char st[50][51],s0[51];
scanf(" %d",&T);
for(i=0;i<T;i++)
{
scanf(" %d",&n);
fflush(stdin);
for(j=0;j<n;j++)
gets(st[j]);
max=n;
for(j=0;j<n-1;j++)
{
t=j;
for(k=j+1;k<n;k++)
if(strcmp(st[t],st[k])>0) t=k;
if(i!=t)
{
strcpy(s0,st[t]);
strcpy(st[t],st[j]);
strcpy(st[j],s0);
}
}
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++)
if(strstr(st[k],st[j])==st[k]) {max--;break;}
printf("%d\n",max);
}
return 0;
}
不知道我这个程序有什么问题,总是AC不了,求各方英雄前来解求 展开
Description
写下这题目的时间是11.24,美国时间也是11.24,以此题祝远在美帝的PKKJ彭教主生日快乐。
生日嘛,自然少不了生日礼物的啦。这天彭教主收到来自中国的一份神秘的生日礼物(传说中是个漂亮的MM o(∩_∩)o 哈哈)。可是礼物却被一个密码锁锁了
起来(pkkj大叫一声:坑爹啊,哪个家伙这么缺德~-_-b)。在礼物箱上还附着一张纸条:嘿嘿~想知道密码吗?那就把下面的题目解出来,答案就是密码啦!
对于一个字符串,定义它的前缀就是指字符串的任意首部。例如字符串abc的前缀有空串,a,ab,abc。
对于一个字符串集合,如果集合中任一个元素都不是其他元素的前缀的话,我们称之为完美非前缀集合。举个例子:{”happy”, “birthday”, “to”,
“pkkj”}就是一个完美非前缀集合,而{“happy”, “hat”, “h”}就不是完美非前缀集合。
现在问题来了,给你一个字符串集合,你要找出一个该集合的子集,使得该子集是一个完美非前缀集合,且包含最多的元素。问你这个完美非前缀子集最多包含
多少个元素?
由于彭教主一心只想着礼物里面的神秘MM,正所谓一心不能二用,所以他想让你帮他来解决这个难题。
Input
第一行只有一个正整数T,表示题目共有T组数据
对于每组数据,输入一个整数n ( 0< n <= 50 ),
接下来有n行,每行输入一个字符串,字符串由小写字母(’a’~’z’)组成,且长度不超过50.
Output
对于每组数据每行输出一个整数,代表一个完美非前缀子集最多包含多少个元素。
Sample Input
2
4
happy
birthday
to
pkkj
4
happy
hat
h
ha
Sample Output
4
2
Hint
对于第一组数据:该集合本身就是一个完美非前缀集合,所以包含最多元素的完美非前缀子集就是它本身,一共有4个元素
对于第二组数据,{”happy”,”hat”}是其中一个的包含最多元素的完美非前缀子集,其元素个数为2
我的思路是:先把字符串排序,然后第一个与后面的字符串比较,是前缀的话个数减一,第二个也是这样,依次类推。。
下面是我写的程序:
#include<stdio.h>
#include<string.h>
main()
{
int i,j,k,T,n,t,max;
char st[50][51],s0[51];
scanf(" %d",&T);
for(i=0;i<T;i++)
{
scanf(" %d",&n);
fflush(stdin);
for(j=0;j<n;j++)
gets(st[j]);
max=n;
for(j=0;j<n-1;j++)
{
t=j;
for(k=j+1;k<n;k++)
if(strcmp(st[t],st[k])>0) t=k;
if(i!=t)
{
strcpy(s0,st[t]);
strcpy(st[t],st[j]);
strcpy(st[j],s0);
}
}
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++)
if(strstr(st[k],st[j])==st[k]) {max--;break;}
printf("%d\n",max);
}
return 0;
}
不知道我这个程序有什么问题,总是AC不了,求各方英雄前来解求 展开
5个回答
展开全部
思路基本没错,代码也基本正确,个别地方出错了。
1、由于ACM是先全部输入再统一输出,你用一个max来存储肯定有问题,可以需要事先声明一个数组来存储结果。下面代码里是用动态内存申请数组。
2、就是排序比较的时候,你有个问题,估计是手误:if(i!=t),实际上应该是if(j!=t)。因为i是外层循环,j才是你要排序的循环。 这个手误导致的结果比较严重,范例输出是没问题,但其它数据会有问题。
我验证了好几组数据基本没问题。下面把修改的地方都标出来了,你可以参照一下。
#include<stdio.h>
#include<string.h>
#include<malloc.h>
int main()
{
int i,j,k,T,n,t,*output; //修改,去掉max,加上指针打算申请数组
char st[50][51],s0[51];
scanf(" %d",&T);
output=(int *)malloc(sizeof(int)*T);//修改,动态申请数组
for(i=0;i<T;i++)
{
scanf(" %d",&n);
fflush(stdin);
memset(*st,0,51);
memset(s0,0,51);
for(j=0;j<n;j++)
gets(st[j]);
output[i]=n; //修改,把max改为数组
for(j=0;j<n-1;j++)
{
t=j;
for(k=j+1;k<n;k++)
if(strcmp(st[t],st[k])>0)
t=k;
if(j!=t) //修改,把i改为j
{
strcpy(s0,st[t]);
strcpy(st[t],st[j]);
strcpy(st[j],s0);
}
}
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++)
if(strstr(st[k],st[j])==st[k])
{
output[i]--; //修改,把max改为数组
break;
}
}
for(i=0;i<T;i++) //for循环是多加上去的,输出最后结果
{
printf("%d\n",output[i]);
}
free(output);//修改,释放内存
return 0;
}
1、由于ACM是先全部输入再统一输出,你用一个max来存储肯定有问题,可以需要事先声明一个数组来存储结果。下面代码里是用动态内存申请数组。
2、就是排序比较的时候,你有个问题,估计是手误:if(i!=t),实际上应该是if(j!=t)。因为i是外层循环,j才是你要排序的循环。 这个手误导致的结果比较严重,范例输出是没问题,但其它数据会有问题。
我验证了好几组数据基本没问题。下面把修改的地方都标出来了,你可以参照一下。
#include<stdio.h>
#include<string.h>
#include<malloc.h>
int main()
{
int i,j,k,T,n,t,*output; //修改,去掉max,加上指针打算申请数组
char st[50][51],s0[51];
scanf(" %d",&T);
output=(int *)malloc(sizeof(int)*T);//修改,动态申请数组
for(i=0;i<T;i++)
{
scanf(" %d",&n);
fflush(stdin);
memset(*st,0,51);
memset(s0,0,51);
for(j=0;j<n;j++)
gets(st[j]);
output[i]=n; //修改,把max改为数组
for(j=0;j<n-1;j++)
{
t=j;
for(k=j+1;k<n;k++)
if(strcmp(st[t],st[k])>0)
t=k;
if(j!=t) //修改,把i改为j
{
strcpy(s0,st[t]);
strcpy(st[t],st[j]);
strcpy(st[j],s0);
}
}
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++)
if(strstr(st[k],st[j])==st[k])
{
output[i]--; //修改,把max改为数组
break;
}
}
for(i=0;i<T;i++) //for循环是多加上去的,输出最后结果
{
printf("%d\n",output[i]);
}
free(output);//修改,释放内存
return 0;
}
追问
关于整体输入输出这个是没要求的,,之前有很多题我都是这样做的。
我把那个‘i’改回‘j’提交后也一样wa了。。应该是有什么特殊情况导致wa的
追答
那你看看有没有什么换行符或者空格之类的要求。
类ACM太搞了,格式控制太严格。
展开全部
好的 我等会过来AC他
明天吧 我等会要睡觉了
明天吧 我等会要睡觉了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-12-04
展开全部
路过
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
都是跟break的吧,若跟continue的话就是结束本次循环,继续执行下一次循环。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
非常抱歉,我的看书不仔细让热心的大家费心了!事实是这样的,case语句如果被含在一个循环体中,后面是可以跟continue的,意思还是结束本次循环。因为用手机上网,不方便发程序举例子了。谢谢大家!如果还有什么问题,很高兴和大家继续探讨!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询