3474. 坠落的蚂蚁 (思维)

3474. 坠落的蚂蚁 - AcWing题库

题意: 一根长度为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()];
      }
   }
}
复制代码
posted @   HHzp  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示