题目:
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
【数据格式】
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
要求输出1个整数,表示最后感冒蚂蚁的数目。
例如:
输入: 3
5 -2 8
程序应输出: 1
输入: 5
-10 8 -20 12 25
程序应输出: 3
资源约定: 峰值内存消耗 < 256M CPU消耗 < 1000ms
分析:
这道题我刚开始分析的时候关注点就错了,总想着他们的相对位置,蚂蚁碰头后要往回走等一系列复杂问题,由于蚂蚁的轨迹多变,思考的东西就会变多,很难理清头绪
但是,铁铁们,这道题要我们求的是蚂蚁数量,而不是哪些蚂蚁被感染了
然后就想到我们能不能把动态的问题变成静态来做呢?
以初始感冒蚂蚁向右为例(向左同理):
代码:
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int arr[n];
for(int i=0;i<n;i++){
cin >> arr[i];
}
int ans = 1;
if(arr[0]>0){//初始感冒蚂蚁向右
for(int i=1;i<n;i++){
if(-arr[i]>arr[0]&&arr[i]<0){
ans++;
}
}
if(ans!=1){//在初始感冒蚂蚁的前面存在反向的蚂蚁
for(int i=1;i<n;i++){
if(arr[i]<arr[0]&&arr[i]>0){
ans++;
}
}
}
}
if(arr[0]<0){//初始感冒蚂蚁向左
for(int i=1;i<n;i++){
if(-arr[0]>arr[i]&&arr[i]>0){
ans++;
}
}
if(ans!=1){//在初始感冒蚂蚁的前面存在向他走来的蚂蚁
for(int i=1;i<n;i++){
if(-arr[i]>-arr[0]&&arr[i]<0){
ans++;
}
}
}
}
cout << ans;
return 0;
}