哎哟那个嘿


私信TA

用户名:657046415

访问量:5094

签 名:

等  级
排  名 8340
经  验 1237
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校 肇庆学院
专  业

  自我简介:

解题思路: 

刚看到题目时觉得很复杂。在推倒例子时意外发现其实可以看做在碰面时,蚂蚁穿过对方,且感染对方。这道题只是需要得知蚂蚁感冒的数目,如果需要知道具体是那只,只需在穿过时交换号码即可。(刚开始发现还很高兴,后来发现原来大家都是这么做)

注意事项: 

要算上原来的第一只蚂蚁所以ans=1


可能的错误:

if(k>0){
		for(int i=2;i<=n;i++){
			if(a[i]<0&&abs(a[i])>k) ans++,b=1; // b=1证明有从a[1]对面来的且被传染的
			if(b==1&&a[i]>0&&a[i]<k) ans++; // 在a[1]后面的且与a[1]同向会被“从a[1]对面来的且被传染的”传染
			
		}
	}

你这里可能会这么写。这样明显不对。因为你不能两个同时确定,但凡有一只“从a[1]对面来的且被传染的”的在a[1]后面的且与a[1]同向的都会被感染,但是你如果同时扫描,就可能漏掉


代码虽然粗糙,但是易想到。

参考代码:  

#include<iostream>
#include<cmath>
using namespace std;

int main(){
	int n;
	int ans=1;
	int b=0;
	cin>>n;
	int a[101];
	for(int i=1;i<=n;++i){
		cin>>a[i];
	}
	int k=a[1];
	if(k>0){
		for(int i=2;i<=n;i++){
			if(a[i]<0&&abs(a[i])>k) ans++,b=1; // b=1证明有从a[1]对面来的且被传染的
		}
		for(int i=2;i<=n;i++){
			if(b==1&&a[i]>0&&a[i]<k) ans++; // 在a[1]后面的会被“从a[1]对面来的且被传染的”传染
			
		}
	}
	if(k<0){
		for(int i=2;i<=n;i++){
			if(a[i]>0&&abs(a[i])<-k) ans++,b=1;	
		}
		for(int i=2;i<=n;i++){
			if(b==1&&a[i]<0&&abs(a[i])>-k) ans++;
			
		}
	}
	cout<<ans;
	return 0;
}


 

0.0分

6 人评分

  评论区

写的真棒,我就是犯了你文中说的错误。感谢感谢!!!
2020-10-09 17:56:43
  • «
  • 1
  • »