アリは風邪をひく
長さ100cmの細くて真っ直ぐな棒にアリがいます。彼らの頭のいくつかは左を向いており、いくつかは右を向いています。
各アリは、1cm /秒の速度でのみポールに沿って前方に登ることができます。
2匹のアリが出会うと、彼らは向きを変え、同時に反対方向に這うでしょう。
これらのアリの中で、1匹のアリが風邪をひいた。そして、他のアリと出会うと、出会ったアリに風邪をひきます。
すべてのアリがポールから離れたときに風邪を引いたアリの数を計算してください。
入る
アリの総数を表す整数n(1 <n <50)を最初の行に入力します。
次の行は、スペースで区切られたn個の整数Xi(-100 <Xi <100)です。Xiの絶対値は、アリと極の左端の間の距離を表します。正の値は頭が右を向いていることを示し、負の値は頭が左を向いていることを示します。データにゼロ値はなく、2匹のアリが同じ位置を占めることはありません。その中で、最初のデータで表されたアリは風邪をひきました。
出力
最後に風邪を引いたアリの数を表す整数を出力する必要があります。
サンプル入力
5
-10 8 -20 12 25
サンプル出力3
問題分析
遭遇後のUターンをシミュレートする代わりに、2回のトラバーサルを使用します。風邪に遭遇した後、2匹のアリが互いに影響を与えずに通過して前進することに相当します。風邪を引いているアリの数が増えるだけです。 、そして2番目のときトラバースするとき、それは主に、初めて風邪を引いたアリとそれに直面しているアリの方向を考慮することです。もっと率直に言って、私は風邪を引いたアリです。目の前にアリが出てきます。それなら間違いなくそのアリに感染します。会った後も前進し続けます。まだ来るアリに遭遇するアリは風邪を彼に渡さなければなりません。これは最初のループトラバーサルの後、アリが風邪に感染するたびに、1つ追加します。そして、風邪を引いたアリの総数が1匹でない場合は、道路で他のアリに会ったばかりで、風邪を引いたということなので、風邪にかかったアリを考えてみてください。同じ原理
#include <iostream>
#include <math.h>
using namespace std;
int main(int argc, char** argv) {
int n;
cin >> n;
int a[n];
for(int i = 0; i < n; i++){
cin >> a[i];
}
int x = a[0];
if(x > 0){ //感冒蚂蚁向右
int res = 1;
for(int i = 0; i < n; i++){
if(a[i] < 0 && -a[i] > x){ //遇上从右向左的蚂蚁 感冒+1 -a[i] - x > 0
res ++;
}
}
if(res != 1){ //有从右向左的蚂蚁
for (int i = 0; i < n; i++){
if(a[i] > 0 && a[i] < x){
res ++;
}
}
}
cout << res << endl;
}
if(x < 0){ //感冒蚂蚁向左
int res = 1;
for(int i = 0; i < n; i++){
if(a[i] > 0 && a[i] < -x){ // -x - a[i]> 0
res ++;
}
}
if(res != 1){
for(int i = 0 ; i < n; i++){
if(a[i] < 0 && -a[i] > -x){ //a[i] > -x -a[i] - -x > 0
res ++;
}
}
}
cout << res << endl;
}
return 0;
}