2022.7.29 LeetCode AcWing
LeetCode
模拟 特判
https://leetcode.cn/problems/valid-square/solution/593-mo-ni-by-sen-xm-73z6/
AcWing
思维题
- 对于A来说,其他蚂蚁碰头与否没有任何关系,即不与A碰头的蚂蚁可以看做相互之间直接穿过而不产生影响。 所以A左边的向左走的蚂蚁和A右边向右走的蚂蚁可以看做未对结果产生影响,直接排除。
- 剩下的A左边向右走和A右边向左走的蚂蚁,每一只都会给A一个“碰头机会”。(即便自己没有碰到A就掉下去,也会因为碰到同在A一侧的其他蚂蚁而把这个“机会“传递下去)所以,决定A能否掉下来,是看A左右两侧的蚂蚁数量是否相等。
- 如果A左右两侧蚂蚁数量不平衡,决定A什么时候掉下来的,是多的一侧,最后一个碰到A的那只蚂蚁,又因为每一侧碰到A蚂蚁的次数等于相应侧蚂蚁的数量,所以该蚂蚁的次序为第 (少一侧蚂蚁数量 + 1)只蚂蚁。(即左右蚂蚁等数量抵消现象)
考虑两只蚂蚁相向而行,由于左侧向右的某蚂蚁从开始时就出发,碰撞后,A蚂蚁维持该蚂蚁的速度继续向右,A从开始运动到实际掉下去的时间,只与最后碰撞A的这只蚂蚁开始时的速度和位置有关,而与A蚂蚁无关。因此,A蚂蚁掉下去的时间是只有这只蚂蚁在杆上运动时掉下去的时间。(由于速度为1,这个值又恰好等于到相应端点的距离。)
#include <bits/stdc++.h>
using namespace std;
vector<int> l, r;
vector<pair<int, int>> da;
int A;
int main() {
int n;
cin >> n;
while (n--) {
int a, b;
cin >> a >> b;
if (b == 0)
A = a;
else
da.push_back({a, b});
}
sort(da.begin(), da.end());
for (auto i : da) {
if (i.first < A && i.second == 1)
l.push_back(i.first);
else if (i.first > A && i.second == -1)
r.push_back(i.first);
}
if (l.size() == r.size())
cout << "Cannot fall!";
else if (l.size() > r.size())
cout << 100 - l[l.size() - r.size() - 1];
else
cout << r[l.size()];
return 0;
}