Feown


私信TA

用户名:uq_13516770928

访问量:4879

签 名:

等  级
排  名 3614
经  验 1887
参赛次数 0
文章发表 21
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

唉,自己根据题目模拟蚂蚁只得了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分

1 人评分

  评论区

  • «
  • »