nyist_990 蚂蚁感冒

来源:互联网 发布:映客刷钻石软件 编辑:程序博客网 时间:2024/04/28 18:28
速度是迷惑人的,蚂蚁开始的位置是确定的,走起来后相互间的位置也是确定的!!。蚂蚁最后走出去就好比:正负号相间的一个序列最后变为左半部位负号右半部为正号(负号代表向左走,正号代表向右走)。
#include<cstdio>#include<cstring>#include<iostream>using namespace std;int abs(int x) {return x>=0?x:-x;}int a[101],b[51],book[101];int main(){int n;while(~scanf("%d",&n)){memset(a,0,sizeof(a));memset(book,0,sizeof(book));int x;for(int i=1;i<=n;i++){    cin>>x;    if(i==1) {book[abs(x)]=1;}    if(x<0) a[-x]=-1;    else a[x]=1;    }   //+1好比正号,-1代好比负号存在一个大小为100的数组int k=0;for(int i=1;i<=100;i++){  //针对每个i,a[i]可表示是否有蚂蚁并能表示方向(0为无蚂蚁,1为向右走的蚂蚁-1为..),book[i]表示是否被感染  if(a[i]) b[++k]=a[i];   //从大小100的a数组转存到大小50的数b组,(因为最多只有50只蚂蚁位置范围为100)同时book数组标记也要相应变化if(book[i]==1) {book[i]=0;book[k]=1;}}//最终数据转化储存在b数组,book随之标记对应蚂蚁是否被感染  int s=1;while(1){          int flag=1;    for(int i=1;i<=k-1;i++)  //遍历b数组,直到左半部为-1右半部为1时终止    {        if(b[i]==1&&b[i+1]==-1) { //具体转化:相邻的(1,-1)为对向的蚂蚁可转为(-1,1)这时要i++          b[i]=-1;b[i+1]=1;flag=0;          if(book[i]==1&&book[i+1]!=1){            book[i+1]=1;s++;          }          else if(book[i]!=1&&book[i+1]==1){            book[i]=1;s++;          }          i++;//ps:曾放在 falg=0;后面,犯了低级错误,多次wrong..        }    }    if(flag) break;}cout<<s<<endl;}return 0;}

1 0