主题:第58次编程比赛初测 & 最终结果
雨中飞燕 [专家分:18980] 发布于 2007-07-30 23:38:00
[color=0000FF]初测结果:[/color]
我直接复制原作者的代码测试的,结果发现这样的话没有一份代码能通过测试
绝大多数代码是WA,少数代码是CE,TLE和RE
现在开始进行放宽限制的测试
如果你觉得你的代码需要更正的,请跟帖,跟帖更正限时一天之内
更正的代码和原来的代码只能相差最多两行并且在20字节以内,
否则更正代码视作无效
[color=0000FF]最终结果:[/color]
本题测试数据一共四个Test,能全部通过前四组的代码的作者有:
flyee (-2)
AntiMicrosoft (-1)
从速度上来说,这两份代码都很好。
从代码结构和算法上来看,两人用的思路也差不多。
所以我决定flyee和AntiMicrosoft两人同时胜出作为本次比赛的冠军
最后更新于:2007-08-01 00:36:00
回复列表 (共42个回复)
31 楼
AntiMicrosoft [专家分:3740] 发布于 2007-08-01 20:56:00
[quote][quote]第二份应该就可以过的:估计是因为你输入部分用的cin>>str1>>str2才超时的[/quote]
为什么输入的部分用 cin>>str1>>str2 就会超时呢?
谁能解释一下啊~~~~[/quote]
C++的IO效率太低 跟scanf比 有10倍以上的差距
32 楼
S石溪X [专家分:290] 发布于 2007-08-01 21:45:00
谢~~
33 楼
crossbow [专家分:150] 发布于 2007-08-01 22:55:00
我是觉得最初100ms的时间太紧了,给选手预留的发挥空间太小了,没有必要这样。尤其是因为程序也是评判标准之一,时间不是唯一的因素,应该是要放宽些的。
34 楼
雨中飞燕 [专家分:18980] 发布于 2007-08-02 20:42:00
[quote]我是觉得最初100ms的时间太紧了,给选手预留的发挥空间太小了,没有必要这样。尤其是因为程序也是评判标准之一,时间不是唯一的因素,应该是要放宽些的。[/quote]
不是的,对于这个题,似乎没什么太多算法可以选择,
方法选得不对的话连结果也是WA。
我给出的代码是O(m+n+min(m,n)),加上数据量不大,100ms都足够了。
另外一种写法是的复杂度是O(m*n),10000*10000的话时间会相差很远,放1000ms也TLE。
结果正确并且算法复杂度不是O(m*n)的,也就只有那两份代码了
35 楼
crossbow [专家分:150] 发布于 2007-08-03 19:19:00
[quote][quote]我是觉得最初100ms的时间太紧了,给选手预留的发挥空间太小了,没有必要这样。尤其是因为程序也是评判标准之一,时间不是唯一的因素,应该是要放宽些的。[/quote]
不是的,对于这个题,似乎没什么太多算法可以选择,
方法选得不对的话连结果也是WA。
我给出的代码是O(m+n+min(m,n)),加上数据量不大,100ms都足够了。
另外一种写法是的复杂度是O(m*n),10000*10000的话时间会相差很远,放1000ms也TLE。
结果正确并且算法复杂度不是O(m*n)的,也就只有那两份代码了[/quote]
我当然知道O(n+m+|Σ|)的算法,不过100ms很容易让钟情cin/cout的程序死掉,虽然这次比赛结果不受这个影响,不过作为比赛的预期是应该预留一些空间的
36 楼
雨中飞燕 [专家分:18980] 发布于 2007-08-03 22:20:00
那倒不会,cin/cout一样不会超,测试量真的很小,单个测试文件的测试数据的也不超过20个case,cin/cout也不会挂
37 楼
hyh2580 [专家分:0] 发布于 2007-08-05 12:38:00
/*帮我看看呀,用VC6的*/
#include <stdio.h>
#define MAX_CHAR_LEN 10001
int main()
{
char str1[MAX_CHAR_LEN],str2[MAX_CHAR_LEN];
while(scanf("%s %s",&str1, &str2) != EOF)
{
//这里写你的计算代码
int a=0,b=0,c=0,i=0,j=0;
while(*(str1+i)!='\0')
{
j=0;
while(*(str2+j)!='\0')
{
if(*(str1+i)==*(str2+i))
{a++;break;}
if(i!=j&&*(str1+i)==*(str2+j))
{b++;break;}
j++;
}
i++;
}
i=0,j=0;
while(*(str2+i)!='\0')
{
j=0;
while(*(str1+j)!='\0')
{
if(*(str2+i)==*(str1+i))
{break;}
if(i!=j&&*(str2+i)==*(str1+j))
{c++;break;}
j++;
}
i++;
}
printf("%dA%dB\n",a,b>c?c:b);
}
return 0;
}
38 楼
雨中飞燕 [专家分:18980] 发布于 2007-08-05 13:25:00
楼上的代码测试结果是WA,
如果你还想提交代码测试一下的,欢迎到[url]http://yzfy.org[/url]
39 楼
zdwzzu2006 [专家分:260] 发布于 2007-08-05 14:55:00
[code=c]
#include <stdio.h>
#include <string.h>
#define MAX 1001
int main()
{
int i,j,na=0,nb=0,len;
char str1[MAX],str2[MAX];
printf("please input the two strings:\n");
scanf("%s",str1);
scanf("%s",str2);
len=strlen(str1);
for(i=0,j=0;i<len;i++,j++)
if(str1[i]==str2[j])
na++;
for(j=0;j<len;j++)
for(i=0;i<len;i++)
if((str2[j]==str1[i])&&(i!=j))
nb++;
printf("the result is %dA%dB\n",na,nb);
return 0;
}
[/code]
这段代码怎样啊?还有什么缺点。 [em1]
40 楼
雨中飞燕 [专家分:18980] 发布于 2007-08-05 15:09:00
你这段代码的输出结果错误
我来回复