View Code
1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 int an[ 3000][ 3000];
5 int main()
6 {
7 int i,k= 0,n,x,y;
8 for(i= 0;i<= 5000;i=i+ 4)
9 {
10 an[i- 2*k][i- 2*k]=i;
11 an[i+ 1- 2*k][i+ 1- 2*k]=(i+ 1);
12 an[i+ 2- 2*k][i- 2*k]=(i+ 2);
13 an[i+ 3- 2*k][i+ 1- 2*k]=(i+ 3);
14 k++;
15 }
16 scanf( " %d ",&n);
17 while(n--)
18 {
19 scanf( " %d %d ",&x,&y);
20 if(x!= 0&&y!= 0&&an[x][y]== 0) printf( " No Number\n ");
21 else printf( " %d\n ",an[x][y]);
22 }
23 return 0;
24 }
2 #include<cstdio>
3 using namespace std;
4 int an[ 3000][ 3000];
5 int main()
6 {
7 int i,k= 0,n,x,y;
8 for(i= 0;i<= 5000;i=i+ 4)
9 {
10 an[i- 2*k][i- 2*k]=i;
11 an[i+ 1- 2*k][i+ 1- 2*k]=(i+ 1);
12 an[i+ 2- 2*k][i- 2*k]=(i+ 2);
13 an[i+ 3- 2*k][i+ 1- 2*k]=(i+ 3);
14 k++;
15 }
16 scanf( " %d ",&n);
17 while(n--)
18 {
19 scanf( " %d %d ",&x,&y);
20 if(x!= 0&&y!= 0&&an[x][y]== 0) printf( " No Number\n ");
21 else printf( " %d\n ",an[x][y]);
22 }
23 return 0;
24 }
这是应用了打表的方法,超时应该不可能。课提交后出现的竟是Memory Limit Exceeded,几乎没出现过这样的错误,经队友发现,我开的数组太大,大小应该是 3000*3000*4/1024=35156.25K >10000K(题目所给的内存),虽然这种方法在处理时简单,可是无用的点太多,内存被大量浪费。
我找到的只是其中一个规律,经队友提醒,有种更优的解法,由所给图可以发现,整数点就可能出现在两条线上,一条是x=y,而另一条是x=y+2。不过还要依据横坐标x是奇偶分情况考虑,如下:
View Code
1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 int main()
5 {
6 int n,x,y;
7 scanf( " %d ",&n);
8 while(n--)
9 {
10 scanf( " %d %d ",&x,&y);
11 if(x==y)
12 {
13 if(x% 2== 1) printf( " %d\n ", 2*x- 1);
14 else printf( " %d\n ", 2*x);
15 }
16 else if(x==y+ 2)
17 {
18 if(x% 2== 1) printf( " %d\n ",x+y- 1);
19 else printf( " %d\n ",x+y);
20 }
21 else printf( " No Number\n ");
22 }
23 return 0;
24 }
2 #include<cstdio>
3 using namespace std;
4 int main()
5 {
6 int n,x,y;
7 scanf( " %d ",&n);
8 while(n--)
9 {
10 scanf( " %d %d ",&x,&y);
11 if(x==y)
12 {
13 if(x% 2== 1) printf( " %d\n ", 2*x- 1);
14 else printf( " %d\n ", 2*x);
15 }
16 else if(x==y+ 2)
17 {
18 if(x% 2== 1) printf( " %d\n ",x+y- 1);
19 else printf( " %d\n ",x+y);
20 }
21 else printf( " No Number\n ");
22 }
23 return 0;
24 }