HDOJ1391

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1391

其实就是找规律的题目,但是我一眼没看到规律!于是按照自己的方法写!

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 struct node{
 7   int x1,y1;
 8   int num;
 9   }a[20000];
10   int cmp(node x,node y)
11 {
12     if (x.x1==y.x1) return x.y1<y.y1;
13     return x.x1<y.x1;
14 }
15 int main()
16 {
17     int x[4]={1,1,1,-1};
18     int y[4]={1,-1,1,1};
19     int xx,yy;
20     xx=yy=0;
21     int t=0;
22     a[0].x1=a[0].y1=0;
23     a[0].num=0;
24     while (xx<4005||yy<5005)
25     {
26         for (int i=0;i<=3;i++)
27         {
28             xx+=x[i];
29             yy+=y[i];
30             t++;
31             a[t].x1=xx;
32             a[t].y1=yy;
33             a[t].num=t;
34         }
35     }
36    sort(a+1,a+t+1,cmp);
37    // for (int i=0;i<=13;i++)
38    // printf("%d:%d %d\n",a[i].num,a[i].x1,a[i].y1);
39    int n;
40     scanf("%d",&n);
41     while (n--)
42     {
43         int nn,mm;
44         scanf("%d%d",&nn,&mm);
45         int l=1,r=t,mid;
46         int flag=1;
47         while (l<=r)
48         {
49             mid=(l+r)/2;
50             if (a[mid].x1==nn&&a[mid].y1==mm) {flag=0;printf("%d\n",a[mid].num);break;}
51             if (a[mid].x1<nn||(a[mid].x1==nn&&a[mid].y1<mm)) l=mid+1;
52             else  r=mid-1;
53         }
54         if (flag) printf("No Number\n");
55     }
56     return 0;
57 }

写和很差,凑合着看吧!大概就是把所有符合规律的都找到,再排序一遍,然后二分找答案!

我想说的是:找到一个合适的方法能让你快速写出题目!而且写的又快又对!

这道题正解应该是:直接找数学规律!!假如X为偶数:答案就是X+Y;

X为奇数:答案为x+y-1;然后就结束了

posted on 2013-11-19 08:11  forgot93  阅读(101)  评论(0编辑  收藏  举报

导航