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;然后就结束了
随性Code