蚂蚁

来源:互联网 发布: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
原创粉丝点击