唉,自己根据题目模拟蚂蚁只得了40分,看的别人答案才发现可以把碰头的蚂蚁掉头看成穿过!且因为速度相同,不存在追上的问题;

这样问题就变得很简单了;

此时题目给出的100cm的长度就已经可以忽略了,即使是无限长,被感染的蚂蚁数量也不变;


因为不用思考每只蚂蚁掉头的后的复杂情况,所以一开始只要是跟感染源对着走的蚂蚁就会被感染;

例如第一只蚂蚁x = 10 是感染源,向右走,那么在x右边的且向左走的蚂蚁就一定会遇见x,就一定会被感染,

接着右边的蚂蚁继续向左走,那么在x左边的且向右走的蚂蚁就一定会跟他们相遇


特殊情况,当x的右边没有向左走的蚂蚁时,即在x的右边包括x在内都是向右走的,那么他们就一直保持原来的距离一直走,

永远不可能相遇感染,那么在x左边的蚂蚁也永远不可能追上x被感染;

所以,当x > 0时,x左边的蚂蚁被感染的条件是 : x右边有被感染的的蚂蚁

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int n;
	int ans = 1;//加上感染源
	int a[55];
	cin>>n;
	for(int i = 0; i < n; i++){
		cin>>a[i];
	}
	int x = a[0];
	if(x > 0){
		for(int i = 1; i < n; i++){
			if(abs(a[i]) > x){
				if(a[i] < 0){
					ans++;
				}
			}
		}
		if(ans > 0){ //当右边有被感染的,左边的才能被感染 
			for(int i = 1; i < n; i++){
				if(abs(a[i]) < x){
					if(a[i] > 0){
						ans++;
					} 
				}
			}
		}
	}
	
	if(x < 0){
		for(int i = 1; i < n; i++){
			if(abs(a[i]) < abs(x)){
				if(a[i] > 0){
					ans++;
				}
			}
		}
		if(ans > 0){ //当左边有被感染的,右边的才能被感染 
			for(int i = 1; i < n; i++){
				if(abs(a[i]) > abs(x)){
					if(a[i] < 0){
						ans++;
					} 
				}
			}
		}
	}
	cout<<ans;
	return 0; 
}

下面的时我模拟的蚂蚁,只得了四十分,我也找不到哪里有问题

#include<iostream>
#include<algorithm>
using namespace std;
int a[10000];
int vis[10000];//感冒
int v[10000];//是否走出去了
int n, ans;
int f(){//是否全走出来了
    for(int i = 0; i < n; i++){
        if(v[i] == 0){
            return 0;
        }
    }
    return 1;
}
void ff(){//检测碰头并掉头
    int b[10000] = {0}; // 记录已经碰头并掉头的,避免重复掉头 
    for(int i = 0; i < n - 1; i++){
        if(!b[i]){
            for(int j = i + 1; j < n; j++){
            	if(!b[j]){
                	if(abs(a[i]) == abs(a[j]) + 1 || abs(a[i]) == abs(a[j]) - 1){//	
                    	if(vis[i] || vis[j]){
                        	vis[i] = 1;
                        	vis[j] = 1;
                    	}
                    	a[i] = -a[i];
                    	a[j] = -a[j];
                    	b[i] = 1;
                    	b[j] = 1;
                		break;
                	}
            	}
        	}
        }
    }
}
int main()
{
    ff();
    vis[0] = 1;
    cin>>n;
   for(int i = 0; i < n; i++){
       cin>>a[i];
   }
   while(!f()){
       for(int i = 0; i < n; i++){
           if(!v[i]){
           	   //a[i]++; 
               if(a[i] > 0){
                   a[i]++;
               } 
               if(a[i] < 0){
                   a[i]--;//这是我一开始没考虑好,认为向左走就是a--,但是我后来发现还是a++,但是改成a++就是0分,不懂了 
               }
               if(a[i] == 0 || abs(a[i]) == 100){
               		v[i] = 1;
			   }
           }
       }
       ff();
   }
   for(int i = 0; i < n; i++){
       if(vis[i]){
           ans++;
       }
   }
   cout<<ans;
   return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论