POJ1663(找规律)
解题思路:这道题其实就是从所给图中找规律,刚开始我把前12个点在演草纸上写出来其对应的坐标,我就想用一个二维数组,行标号表示x,列标号表示y,如果对应值不为零就直接输出,否则就输出 No Number 。程序如下:
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 }