← 轻点一下
我觉得这题应该是一道思维题,要懂点脑子
我还是写注释了哈,这样大家对照代码看起来方便一点,我写起来也方便一点
C++ 代码
#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
vector<int> l,r; //l表示在A蚂蚁左边向右爬的蚂蚁 r表示在A蚂蚁右边向左爬的蚂蚁
vector<pair<int,int> > d; //保存除了A以外的所有蚂蚁的信息
int A; //记录A的位置
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int m,p;
cin>>m>>p;
if(p!=0) d.push_back({m,p}); //一般的蚂蚁就直接把信息保存到d
else A=m; //若状态为静止那么就认定它为A
}
sort(d.begin(),d.end()); //排序,使我们待会的l和r是有序的
for(auto i:d){
if(i.first<A&&i.second==1) l.push_back(i.first); //如果在A的左边且向右爬,那么放入l
if(i.first>A&&i.second==-1) r.push_back(i.first); //如果在A的右边且向左爬,那么放入r
//如果是往其他方向爬的蚂蚁就跟A没有关系,不用管它
}
int L=l.size(),R=r.size();
if(L==R) puts("Cannot fall!"); //两边的蚂蚁数相等,A就仍是静止的,不可能掉下去
else if(L<R) printf("%d",r[L]); //右边蚂蚁多的时候,右边的L个蚂蚁就会被左边的抵消
else if(L>R) printf("%d",100-l[L-R-1]); //左边蚂蚁多的时候,左边的后R个蚂蚁就会被右边的抵消
return 0;
}