您的位置:首页 > 其它

nyist_990 蚂蚁感冒

2016-07-06 13:10 267 查看
速度是迷惑人的,蚂蚁开始的位置是确定的,走起来后相互间的位置也是确定的!!。蚂蚁最后走出去就好比:正负号相间的一个序列最后变为左半部位负号右半部为正号(负号代表向左走,正号代表向右走)。
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: