3474. 坠落的蚂蚁 (思维)
题意: 一根长度为100的绳子上几个蚂蚁,每个蚂蚁都会向左或向右运动,有且只有一只是静止不懂的,然后两只蚂蚁相遇时会交换速度,当到0或者100的位置会掉下去,问开始静止的蚂蚁,需要多久会掉下去,如果掉不下去输出“ Cannot fall! ”
题解: 因为两个运动的蚂蚁如果相撞,他们会交换速度,然后反向移动,但可以换角度理解,其实就是没有交换速度,依旧按照原方向移动,因为不需要具体管这是那个蚂蚁,只在乎他的轨迹。
然后思考静止不动的蚂蚁:
- 考虑它左右边向它移动的蚂蚁数目,如果相同,那么他们最后会相互抵消,静止的还是静止的。
- 如果不同,那么最后移动的方向肯定是多的那边决定的,然后肯定是被先触碰到它的蚂蚁带动,所以找到第一个触碰到它的蚂蚁即可。
例如: 下面这个例子,静止点左边有一个点,右边两个点,然后看左边,95被10抵消了,然后第一个点就是98,所以最后被98带动,答案就是98
4
10 1
90 0
95 -1
98 -1
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const int N=1e5+10; const ll inf=2e15; ll a[N],cnt; vector<ll> p[3]; pll q[N]; signed main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); ll t;cin>>t; ll beg; for(ll i=1;i<=t;i++){ cin>>q[i].first>>q[i].second; if(q[i].second==0) beg=q[i].first; } for(ll i=1;i<=t;i++){ if(q[i].first<beg&&q[i].second==1) p[1].push_back(q[i].first); if(q[i].first>beg&&q[i].second==-1) p[2].push_back(q[i].first); } sort(p[1].begin(),p[1].end());//排序一下 sort(p[2].begin(),p[2].end()); if(p[1].size()==p[2].size()) cout<<"Cannot fall!"<<endl; else { if(p[1].size()>p[2].size()){ cout<<100-p[1][p[1].size()-p[2].size()-1];//左边的点的距离是100-x } else{ cout<<p[2][p[1].size()]; } } }