长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。
并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
格式要求:

题解:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//自定义绝对值排序 后续用sort对数组进行排序
bool cmp (const int a, const int b)
{
return abs(a) < abs(b);
}
int main(){
//先按绝对值排序 相邻之中 左正右负会相遇
//不需要考虑离开时间 只需要考虑感冒的蚂蚁和几只蚂蚁相遇了
int n = 0;
cin>>n;
//使用一个数组来保存
vector<int> distance(n);
for(int i = 0;i<n;i++){
cin>>distance[i];
}
//记录下感冒蚂蚁的相对位置
int num = distance[0];
//sort排序
sort(distance.begin(),distance.end(),cmp);
//记录下感冒了蚂蚁的下标
int index = 0;
for(int i = 0;i<n;i++){
if(num == distance[i]){
index = i;
}
}
//使用数组记录感冒蚂蚁的下标
vector<int> ganmao;
ganmao.push_back(index);
//用一个数来记录不相遇的蚂蚁对
int num_2 = 0;
//多次遍历 寻找会相遇的蚂蚁对
while(true){
//归零
num_2 = 0;
for(int i = 0;i<n-1;i++){
if(distance[i]>0 && distance[i+1]<0){
//会相遇 做一次转换 正负数转
distance[i] = -distance[i];
distance[i+1] = -distance[i+1];
//判断相遇的蚂蚁中是否有感冒的
if(find(ganmao.begin(),ganmao.end(),i)!= ganmao.end() && find(ganmao.begin(),ganmao.end(),i+1) == ganmao.end()){
//有
ganmao.push_back(i+1);
continue;
}else if(find(ganmao.begin(),ganmao.end(),i) == ganmao.end() && find(ganmao.begin(),ganmao.end(),i+1)!= ganmao.end()){
//有
ganmao.push_back(i);
}
}else{
//蚂蚁不相遇
num_2++;
}
}
//当最后状态是负数全在正数左边是结束
if(num_2 == n-1){
break;
}
}
cout<<ganmao.size();
return 0;
}

411

被折叠的 条评论
为什么被折叠?



