为了这道题目我头发都白了!ACM题,答案错误,高手帮我看看把!!!

a542107840 2010-08-31 06:53:07
题目链接http://acm.nit.net.cn/showproblem.jsp?pid=1157
我写的程序:

#include<stdio.h> /*提交的时候说我答案错误,我都改了14遍了,还是错误,高手们帮我看看把*/
#include<string.h>
struct s
{
char name[100]; /*大家帮我改好了可以去上面这个网址提交一下,帐号:csdn.密码:111111*/
int num;
};
int main()
{
int n,i,k,h,j;
char str[100];
static struct s a[1005];
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf("%s%d",str,&j);
strcpy(a[j].name,str);
}
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%d",&h);
if(h>n)
printf("void\n");
else
printf("%s\n",a[h].name);
}
printf("\n");
}
return 0;
}


谢谢的话我也就不多说了!!
...全文
440 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
nwao7890 2010-09-16
  • 打赏
  • 举报
回复
可以结贴了。ACM还是去大一点的网站好。POJ什么的。有保障
yutaooo 2010-09-15
  • 打赏
  • 举报
回复
注册了一下,试了一下,好像失败了。

Judge Status: Time Limit Exceeded



#include <stdio.h>
#include <string.h>

static char person_set[1001][65];

int
main() {
int N, n;
char name[65];
int id;
int K;
int x;

strcpy(person_set[0], "void");

scanf("%d", &N);
n = N;
while (n-- != 0) {
scanf("%s %d", name, &id);
strcpy(person_set[id], name);
}

scanf("%d", &K);
while (K-- != 0) {
scanf("%d", &x);
if (x > N)
x = 0;
printf("%s\n", person_set[x]);
}

return (0);
}

zbcfscc 2010-09-14
  • 打赏
  • 举报
回复
case的个数不是无限个,不然人家怎么测你的程序用来多少时间啊,样本就到输入的EOF为止,自然有最后一个case
zbcfscc 2010-09-14
  • 打赏
  • 举报
回复
唉,ACM就不能死脑筋,人家只认你程序回答的对不对,才不管你怎么想的、怎么做的。你如果搞到了测试样本,直接printf输出人家也判你对,可是就算你的算法再好再巧妙,只要少个空格回车还是判你错。
a542107840 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 a542107840 的回复:]
引用 10 楼 baihacker 的回复:
引用 9 楼 a542107840 的回复:
引用 5 楼 baihacker 的回复:
C/C++ code

//哦是我看错了,trick只有一个,name中有空格,所以需要gets
//还要注意就是case之间才有空行

#include<stdio.h> /*提交的时候说我答案错误,我都改了14遍了,还是错误,高手们帮我看看把*……
[/Quote]
这位高手你复制这句话,对我来说没用,这题目我没少看,我始终都有一个最核心的问题,就是这里说的case到低指什么?我的理解是(下面是我自己写的程序运行的结果):

我想你能看出我是怎么想的把!所以我不能理解你的意思!
a542107840 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 baihacker 的回复:]
引用 9 楼 a542107840 的回复:
引用 5 楼 baihacker 的回复:
C/C++ code

//哦是我看错了,trick只有一个,name中有空格,所以需要gets
//还要注意就是case之间才有空行

#include<stdio.h> /*提交的时候说我答案错误,我都改了14遍了,还是错误,高手们帮我看看把*/
#include<string.h>
s……
[/Quote]
我现在心里的难受程度足以让我拿起手机给你打电话,和你当场请教了,可惜我没你号。下面有图有真相,我想和你进行彻底的交流。
下面是运行你给的程序后我截的图:
a542107840 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 nwao7890 的回复:]
我知道你想问什么, 试想如果只有一个CASE时,你的程序仍会在最后输出一个空行,这不符合“输出中每两个case之间用一个空行格开。”
[/Quote]
一开始觉的你有道理,可是后来一想,又觉的不对劲,首先题目是这样说的"输入文件中有多组case。每一组case第一行包含一个整数N(1 <= N <= 1000),表示队员的人数。"一般这样的我都会用while输入,就像上面我自己写的程序一样,应为我觉的这是不停的输入的,所以我觉的无所谓最后一个case,你觉的呢?谢谢你回我的贴!!继续~~
nwao7890 2010-09-14
  • 打赏
  • 举报
回复
我知道你想问什么, 试想如果只有一个CASE时,你的程序仍会在最后输出一个空行,这不符合“输出中每两个case之间用一个空行格开。”
baihacker 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 a542107840 的回复:]
引用 5 楼 baihacker 的回复:
C/C++ code

//哦是我看错了,trick只有一个,name中有空格,所以需要gets
//还要注意就是case之间才有空行

#include<stdio.h> /*提交的时候说我答案错误,我都改了14遍了,还是错误,高手们帮我看看把*/
#include<string.h>
struct s
{
char name[10……
[/Quote]


输出:


对应最后K行的每一个id号,每一行输出队员的name,要是这个id对应的name不存在,输出 "void";
输出中每两个case之间用一个空行格开。
a542107840 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 baihacker 的回复:]
C/C++ code

//哦是我看错了,trick只有一个,name中有空格,所以需要gets
//还要注意就是case之间才有空行

#include<stdio.h> /*提交的时候说我答案错误,我都改了14遍了,还是错误,高手们帮我看看把*/
#include<string.h>
struct s
{
char name[100]; /……
[/Quote]
这位高手的程序真的可以,但我只认同了一点,就是名字是要gets才行,但对于另一点我真的很困惑,到现在还不明白,就是所谓的“//还要注意就是case之间才有空行”,结果我运行了你给的程序,看到了这个空行的位置,我真的感到很奇怪,我不完全不能理解,打死我也想不到是这种情况,如果有谁路过能不能帮我看看,帮我解答一下,也算是帮我解决一块心病吧!
nwao7890 2010-09-03
  • 打赏
  • 举报
回复
for(i=1;i<=n;i++)
{
gets(str);
j = strlen(str) - 1;
while (str[j] != ' ') --j;
str[j] = 0;
sscanf(str+j+1, "%d", &v);
strcpy(a[v].name,str);
}
我也没注意到这一点...要用GETS..
nwao7890 2010-09-03
  • 打赏
  • 举报
回复
一会把我的发上来
baihacker 2010-08-31
  • 打赏
  • 举报
回复

//哦是我看错了,trick只有一个,name中有空格,所以需要gets
//还要注意就是case之间才有空行

#include<stdio.h> /*提交的时候说我答案错误,我都改了14遍了,还是错误,高手们帮我看看把*/
#include<string.h>
struct s
{
char name[100]; /*大家帮我改好了可以去上面这个网址提交一下,帐号:csdn.密码:111111*/
int num;
};
int main()
{
int n,i,k,h,j,v;
char str[100];
static struct s a[1005];
int curr = 1;
while(scanf("%d",&n)!=EOF)
{
while (getchar() != '\n');
if (curr++ > 1) puts("");
for(i=1;i<=n;i++)
{
gets(str);
j = strlen(str) - 1;
while (str[j] != ' ') --j;
str[j] = 0;
sscanf(str+j+1, "%d", &v);
strcpy(a[v].name,str);
}
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%d",&h);
if(h>n)
printf("void\n");
else
printf("%s\n",a[h].name);
}
}
return 0;
}
a542107840 2010-08-31
  • 打赏
  • 举报
回复
不好意思,我想你题目没看清楚,如果n是5,那么id就在1和5之间,不可能是你说的这种情况,请再帮我看看,拜托了!
[Quote=引用 1 楼 baihacker 的回复:]
n是人数,并不是最大的ID。
比如有5个人,他们的ID分别是
1 2 4 8 32
你的程序就错了。

做法是把所有人的名字和ID存起来,然后按ID排序,然后二分搜索。
[/Quote]
leiyun121 2010-08-31
  • 打赏
  • 举报
回复
1楼的牛叉,一语中的!
fanster28_ 2010-08-31
  • 打赏
  • 举报
回复
LS V5~
baihacker 2010-08-31
  • 打赏
  • 举报
回复
n是人数,并不是最大的ID。
比如有5个人,他们的ID分别是
1 2 4 8 32
你的程序就错了。

做法是把所有人的名字和ID存起来,然后按ID排序,然后二分搜索。

70,033

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧