POJ1663(找规律)

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

ExpandedBlockStart.gif 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 }

 

转载于:https://www.cnblogs.com/yueshuqiao/archive/2012/05/07/2487154.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值