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 }

这是应用了打表的方法,超时应该不可能。课提交后出现的竟是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 }

 

posted @ 2012-05-07 11:50  笑巧  阅读(361)  评论(0编辑  收藏  举报