蚂蚁
来源:互联网 发布:ubuntu 12.04 配置dns 编辑:程序博客网 时间:2024/06/09 20:54
原来是一道很简单的枚举题,然后我把它加难了一点点。
题意是,给你N个点,它们会向四周一个固定的方向移动,它们的速度都是相同的,当相撞的时候所有正好运动到这个地方的点都会消失。问最后还会剩下多少个点
原本N<=50并且都会在4000到-4000的范围内,然后我机智的改成了N<=8000并且没有范围限制.
于是我们可以在坐标系内搞定
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<cmath>#define N 5005#define inf 1005using namespace std;int f[N],an[N],ans,n,tot;int d[N][2];//int a[N][N];struct wakaka{ int key,x,y; }e[N*5];bool check2(int x,int y){ int x1=d[x][0],y1=d[x][1],f1=f[x],x2=d[y][0],y2=d[y][1],f2=f[y]; if (d[x][1]<d[y][1]) {swap(x1,x2);swap(y1,y2);swap(f1,f2);}// printf("%d %d %d %d %d %d %d %d\n",x1,y1,f1,x2,y2,f2,x,y); if (x1>x2) { if (f1==2&&f2==4) return true; if (f1==3&&f2==1) return true; return false; } if (x1<x2) { if (f1==4&&f2==1) return true; if (f1==2&&f2==3) return true; return false; } }int calc(int x,int y){ if (x==y) return inf; if (f[x]==f[y]) return inf; if (d[x][0]==d[y][0]) { if (d[x][1]>d[y][1]&&f[x]==2&&f[y]==1) { return (d[x][1]-d[y][1]); } if (d[x][1]<d[y][1]&&f[x]==1&&f[y]==2) { return (d[y][1]-d[x][1]); } return inf; } if (d[x][1]==d[y][1]) { if (d[x][0]>d[y][0]&&f[x]==3&&f[y]==4) { return (d[x][0]-d[y][0]); } if (d[x][0]<d[y][0]&&f[x]==4&&f[y]==3) { return (d[y][0]-d[x][0]); } return inf; } if (abs(d[x][1]-d[y][1])==abs(d[x][0]-d[y][0])&&check2(x,y)) return abs(d[x][1]-d[y][1])*2; return inf; }void check(int x,int y){// a[y][x]=a[x][y]=calc(x,y); int k=calc(x,y); if (k!=inf) { e[++tot].key=k; e[tot].x=x;e[tot].y=y; } } bool com(wakaka a,wakaka b){ if (a.key<b.key) return 1; else return 0; }int main(){ freopen("ant.in","r",stdin); freopen("ant.out","w",stdout); scanf("%d",&n);getchar(); for (int i=1;i<=n;i++) { int ch=getchar(); if (ch=='N') f[i]=1; if (ch=='S') f[i]=2; if (ch=='W') f[i]=3; if (ch=='E') f[i]=4;// cout<<f[i]<<' '; }// cout<<endl; for (int i=1;i<=n;i++) { int x,y; scanf("%d %d\n",&x,&y); d[i][0]=x;d[i][1]=y; } for (int i=1;i<=n;i++) for (int j=i;j<=n;j++) check(i,j); sort(e+1,e+tot+1,com); int anss=0;memset(an,1,sizeof(an)); for (int i=1;i<=tot;i++) { int t=e[i].key,x=e[i].x,y=e[i].y; if (!an[x]||!an[y]) continue;// cout<<x<<' '<<y<<endl; anss+=2;an[x]=0;an[y]=0; for (int j=1;j<=n;j++) { if (calc(x,j)==t&&an[j]) { an[j]=0; anss++; } if (calc(y,j)==t&&an[j]) { an[j]=0; anss++; } } } printf("%d\n",n-anss); return 0;}
0 0
- 蚂蚁
- 蚂蚁
- 蚂蚁
- 蚂蚁
- 蚂蚁
- [面试题] 蚂蚁蚂蚁
- 蚂蚁算法
- 蚂蚁报恩
- 蚂蚁题
- 蚂蚁算法
- 蚂蚁走弹绳
- 蚂蚁哲学
- 飞蚂蚁
- poj1852 蚂蚁
- 蚂蚁问题
- 蚂蚁觅食
- 蚂蚁感冒
- 蚂蚁感冒
- Java习题
- qmlAndriod手机加载本地Html文件
- 能写这么全也没谁谁了
- 杂谈:360 、 酷派 一次联婚,一个爱情故事
- Android 编程下 Touch 事件的分发和消费机制
- 蚂蚁
- python文件操作
- [LeetCode] Remove Duplicates from Sorted List II
- LeetCode Find Minimum in Rotated Sorted Array II 有条件的二分
- hdu2041
- Redis各种数据结构介绍以及相应的业务场景应用
- Kmeans算法寻找合适K值
- NYOJ 17 单调递增最长子序列 (二分 STL,lower_bound)
- 深入剖析U3D的Miss Mono Behaviour问题