0%

NOIP2016更改

12.07更新,全部测试数据通过。

在NOI官网拿到了NOIP2016的测试数据,顺便下载下来测试了一下之前写的代码。

在实际测试中遇到第十二组数据出错的情况,这个是我更改后的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <cstdio>
using namespace std;
int main ()
{
int n,m,i=0,ans=0,command_1,command_2,flag,x=0;
scanf("%d%d",&n,&m);
int pan[n];
char job[n][15];
while(i<n)
{
scanf("%d%s",&pan[i],job[i]);
i++;
}
i=0;
while(i<m)
{
scanf("%d%d",&command_1,&command_2);
flag=1;
if(pan[x]==command_1)
{
flag=-1;
ans+=command_2*(-1);
}
else
ans+=command_2;
x=(x+command_2*flag)%n;
if(x<0)
x=n+x;
i++;
}
ans=ans%n;
if(ans<0)
ans=n+ans;
printf("%s",job[ans]);
}

下面是原本的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <cstdio>
using namespace std;
int main ()
{
int n,m,i=0,ans=0,command_1,command_2,flag,x=0;
scanf("%d%d",&n,&m);
int pan[n];
char job[n][10];
while(i<n)
{
scanf("%d%s",&pan[i],job[i]);
i++;
}
i=0;
while(i<m)
{
scanf("%d%d",&command_1,&command_2);
flag=1;
if(pan[x]==command_1)
{
flag=-1;
ans+=command_2*(-1);
}
else
ans+=command_2;
x=(x+command_2*flag)%n;
if(x<0)
x=n+x;
i++;
}
ans=ans%n;
if(ans<0)
ans=n+ans;
printf("%s",job[ans]);
}

把第九行job[n][10]变成了job[n][15],解决第十二组数据的出错的问题,第十七组数据目前还未解决(有可能是数据本身是错的)。

第十二组的问题在于原本的字符数据太短,不足以储存“job”。

这次是为了说明为什么数组短了之后为什么出错。

按照数组的定义,数组实际上是一串连续的变量;

若有这样一个数组char str[4][5];

当使用printf(“%s”,str[0]);输出二维数组,若数组内容如下

0 1 2 3 4
str[0] B D Z N \0
str[1] X I D I \0
str[2] A B C D \0
str[3] H C X . \0

输出内容自然是“BDZN”,若是二维数组内容如下

0 1 2 3 4
str[0] B D Z N H
str[1] X I D I A
str[2] A B C D E
str[3] H C X . \0

输出内容将会是”BDZNHXIDIAABCDEHCX.”,这个与格式化输出控制符”%s”有关系,函数判断一个字符数组的结尾是以“\0”来判断的,它会输出到第一个“\0”前面的那个字符,所以二维数组如果某行被占满,使用“%s”来输出这行内容时,会连带下一行也输出。解决办法是将数组长度增加,防止该行被非”\0”的字符占满。C++的cout与这个类似。

磨磨蹭蹭,12.7更新,调整了一下,发现第十七组的数据错误所在,直接贴出代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <cstdio>
using namespace std;
int main ()
{
freopen("toy.in","r",stdin);
freopen("toy.out","w",stdout);
int n,m,i=0,ans=0,command_1,command_2;
scanf("%d%d",&n,&m);
int pan[n];
char job[n][15];
while(i<n)
{
scanf("%d%s",&pan[i],job[i]);
i++;
}
i=0;
while(i<m)
{
scanf("%d%d",&command_1,&command_2);
command_2=command_2%n;
if(pan[ans]==command_1) //顺时针走
{
ans-=command_2;
if(ans<=0)
ans+=n;
}
else //逆时针针走
{
ans+=command_2;
if(ans>=n)
ans-=n;
}
i++;
}
printf("%s",job[ans]);
}

问题其实还是比较明显的,原本的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while(i<m)
{
scanf("%d%d",&command_1,&command_2);
flag=1;
if(pan[x]==command_1) //顺时针
{
flag=-1;
ans+=command_2*(-1);
}
else //逆时针
ans+=command_2;
x=(x+command_2*flag)%n;
if(x<0)
x=n+x;
i++;
}

更改后的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while(i<m)
{
scanf("%d%d",&command_1,&command_2);
command_2=command_2%n;
if(pan[ans]==command_1) //顺时针走
{
ans-=command_2;
if(ans<=0)
ans+=n;
}
else //逆时针针走
{
ans+=command_2;
if(ans>=n)
ans-=n;
}
i++;
}

问题在于没有考虑越界问题

生命在于折腾