蚂蚁感冒

题意

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

题解

首先明白两只蚂蚁碰撞之后掉头和穿行过去是一样的,可以把穿行看做碰撞后掉头了,然后两个蚂蚁交换了,而是哪一只蚂蚁对结果不影响。
那么,假如第一只感冒蚂蚁向右走,那么碰到所有想左走的都会被感染,而感染后的蚂蚁必定是向左走的,那么他会把左边向右走的都感染了。
向左走的也是这样。
所以 ans = 左边向右走的 + 右边向左走的 + 1(本身)。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <bits/stdc++.h>
#define forl(i, l, r) for (int i = l; i <= r; i++)
#define forr(i, r, l) for (int i = r; i >= l; i--)
#define for1(i, n) for (int i = 1; i <= n; i++)
#define for0(i, n) for (int i = 0; i < n; i++)
#define meminf(a) memset(a, inf, sizeof(a))
#define mem_1(a) memset(a, -1, sizeof(a))
#define mem0(a) memset(a, 0, sizeof(a))
#define inlld(lld) scanf("%lld", &lld)
#define inlf(f) scanf("%lf", &f)
#define ind(d) scanf("%d", &d)
#define ins(s) scanf("%s", s)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
typedef std::pair<long long, long long> pll;
typedef std::vector<long long> vll;
typedef std::pair<int, int> pii;
typedef unsigned long long ull;
typedef std::vector<int> vii;
typedef long double db;
typedef long long ll;
const db pi = acos((db)-1);
const ll inf =0x3f3f3f3f;
const ll mod = 1e9+7;
const int N = 1.1e5;
const db eps = 1e-8;
using namespace std;
int sign(db a) { return a < -eps ? -1 : a > eps; }
int db_cmp(db a, db b){ return sign(a-b); }

struct da{
int num;
bool kind;
da(){}
da (int a,bool b){
num=a;
kind=b;
}
bool operator <(const da y)const{
return num<y.num;
}
}a[55];

int main() {
#ifdef PerpEternal
// freopen("/Users/perpeternal/Documents/Sketch/data/in.dat", "r", stdin);
// freopen("/Users/perpeternal/Documents/Sketch/data/out.dat", "w", stdout);
#endif
//ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n,x;
ind(n);
for0(i,n){
ind(x);
if(x<0){
a[i]=da(-x,0);
}else a[i]=da(x,1);
}
x=a[0].num;
bool flag=a[0].kind,right=0;
sort(a,a+n);
int l=0,r=0;
for0(i,n){
if(a[i].num==x){
right=1;
continue;
}
if(right&&a[i].kind==0){
r++;
}else if(!right&&a[i].kind){
l++;
}
}
int ans=1;
if(l&&r)ans+=l+r;
else if(flag){
ans+=r;
}else ans+=l;
printf("%d\n",ans);
return 0;
}

引用

https://blog.csdn.net/y990041769/article/details/21941711