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; }
相关文章推荐
- 菜鸟物流的运输网络(计蒜客复赛F)
- 模拟键盘事件 keyevent
- 采用遍历数组的指针
- 自定义RadioButton
- OpenResty最佳实践
- iOS中图片压缩的常见方法
- 让我在流年里深醉
- Android启动过程深入解析
- CMakeLists.txt添加opencv库注意事项
- [MTK] 平板项目,进入工程模式
- js的function
- 谷歌浏览器插件
- 决策树之 ID3 算法
- 关于特修斯之船(转自知乎)
- 决策树之 ID3 算法
- metaq
- Windows - could-not-be-started-because-the-hypervisor-is-not-running
- 智弘分享::高效能人士的七个习惯分享系列
- JasperReportforServletDemo
- IQKeyboardManager 用法