2022.7.29 LeetCode AcWing

LeetCode

模拟 特判
https://leetcode.cn/problems/valid-square/solution/593-mo-ni-by-sen-xm-73z6/

AcWing

思维题

  1. 对于A来说,其他蚂蚁碰头与否没有任何关系,即不与A碰头的蚂蚁可以看做相互之间直接穿过而不产生影响。 所以A左边的向左走的蚂蚁和A右边向右走的蚂蚁可以看做未对结果产生影响,直接排除。
  2. 剩下的A左边向右走和A右边向左走的蚂蚁,每一只都会给A一个“碰头机会”。(即便自己没有碰到A就掉下去,也会因为碰到同在A一侧的其他蚂蚁而把这个“机会“传递下去)所以,决定A能否掉下来,是看A左右两侧的蚂蚁数量是否相等。
  3. 如果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;
}

posted @ 2022-07-29 10:04  superPG  阅读(15)  评论(0编辑  收藏  举报