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()]; } } }
分类:
做题记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗