HDU 6147 Pokémon GO II(计算几何)
2018-01-21 19:32
399 查看
Description
起点在原点,每次操作给出一个长度x,表示从当前位置向前走x米后右转,问路径是否会相交
Input
第一行一整数T表示用例组数,每组用例首先输入操作数n,之后输入n个距离xi(1≤T≤100,1≤n≤106,1≤xi≤109)
Output
如果路径会相交则输出第一次路径相交时的操作编号,否则输出“Catch you”
Sample Input
3
4
2 2 2 2
4
2 1 3 1
5
2 1 3 1 3
Sample Output
4
Catch you
5
Solution
如果路径不相交则路径必然一个越来越大的螺旋形,如果当前走的这一步与之前路径相交,则这两条路径编号差距不大,试几种情况可知最多会差5条边,那么只要对于每一步,枚举其前面5步, 判断两条线段是否相交即可
Code
起点在原点,每次操作给出一个长度x,表示从当前位置向前走x米后右转,问路径是否会相交
Input
第一行一整数T表示用例组数,每组用例首先输入操作数n,之后输入n个距离xi(1≤T≤100,1≤n≤106,1≤xi≤109)
Output
如果路径会相交则输出第一次路径相交时的操作编号,否则输出“Catch you”
Sample Input
3
4
2 2 2 2
4
2 1 3 1
5
2 1 3 1 3
Sample Output
4
Catch you
5
Solution
如果路径不相交则路径必然一个越来越大的螺旋形,如果当前走的这一步与之前路径相交,则这两条路径编号差距不大,试几种情况可知最多会差5条边,那么只要对于每一步,枚举其前面5步, 判断两条线段是否相交即可
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; typedef pair<int,int>P; const int INF=0x3f3f3f3f,maxn=1000001; struct node { ll x,y; node operator -(const node&b)const { return (node){x-b.x,y-b.y}; } }a[maxn]; int T,n; int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; int mul(node a,node b) { ll t=a.x*b.y-a.y*b.x; if(t==0)return 0; if(t<0)return -1; return 1; } int check(node a,node b,node c,node d) { b=b-a,c=c-a,d=d-a; a.x=a.y=0; int acd=mul(c-a,d-a),bcd=mul(c-b,d-b),cab=mul(a-c,b-c),dab=mul(a-d,b-d); if(!acd&&a.x>=min(c.x,d.x)&&a.x<=max(c.x,d.x)&&a.y>=min(c.y,d.y)&&a.y<=max(c.y,d.y))return 1; if(!bcd&&b.x>=min(c.x,d.x)&&b.x<=max(c.x,d.x)&&b.y>=min(c.y,d.y)&&b.y<=max(c.y,d.y))return 1; if(!cab&&c.x>=min(a.x,b.x)&&c.x<=max(a.x,b.x)&&c.y>=min(a.y,b.y)&&c.y<=max(a.y,b.y))return 1; if(!dab&&d.x>=min(a.x,b.x)&&d.x<=max(a.x,b.x)&&d.y>=min(a.y,b.y)&&d.y<=max(a.y,b.y))return 1; if(acd==0||bcd==0||cab==0||dab==0)return 0; if(acd*bcd<0&&cab*dab<0)return 1; return 0; } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); a[0].x=a[0].y=0; int to=0; for(int i=1;i<=n;i++) { int d; scanf("%d",&d); a[i].x=a[i-1].x+d*dx[to],a[i].y=a[i-1].y+d*dy[to]; to=(to+1)%4; } int ans=0; for(int i=3;i<=n;i++) { for(int j=i-2;j>=max(1,i-5);j--) { if(check(a[j-1],a[j],a[i-1],a[i])) { ans=i; break; } } if(ans)break; } if(ans)printf("%d\n",ans); else printf("Catch you\n"); } return 0; }
相关文章推荐
- [HDOJ6147] Pokemon GO II(规律,几何)
- HDU 5365(计算几何)
- hdu 5128 The E-pang Palace(计算几何,暴力枚举)
- 【2016-CCPC-H】计算几何(Special Tetrahedron,hdu 5839)
- HDU 1065 I Think I Need a Houseboat 计算几何
- HDU 1007 Quoit Design(计算几何 平面最近点对)
- HDU 4024 Dwarven Sniper’s hunting (计算几何-其它,搜索-二分)
- HDU 5572 An Easy Physics Problem (计算几何 点类 线类 向量类 线段与圆相交)
- hdu 1348 wall (计算几何,凸包)
- SDUT 2374 || HDU 1803Cylinder(计算几何求体积)
- hdu 1077 Catching Fish 计算几何(圆覆盖)
- HDU 4798 计算几何 解题报告
- HDU 4802 && HDU 4803 贪心,高精 && HDU 4804 轮廓线dp && HDU 4805 计算几何 && HDU 4811 (13南京区域赛现场赛 题目重演A,B,C,D,J)
- HDU 5784 (计算几何)
- HDU 2438 Turn the corner (计算几何 + 三分)
- [HDU 4082] Hou Yi's secret (简单计算几何)
- hdu 1154 poj 2462 Cutting a polygon 计算几何
- hdu 4617 2013多校联合训练第二场weapon简单的计算几何
- HDU 4793 Collision 【计算几何】
- HDU-2857-Mirror and Light(计算几何)