题目:n 个参与者排成一队,游戏从队列中的第 11 个人(从左到右)开始,每一轮由队列的前 2 个人进行游戏,如果第 1 个人的体重 a1 ≥ 队列中的第 2 个人的体重 a2 ,那么第 1 个人获胜,第 2 个人离开队列并重新加入到队尾(成为队列中的最后一个人),反之第 2 个人获胜,第 1 个人离开队列并重新加入到队尾,之后继续进行游戏,如果某一个人连续获胜 kk 轮,那么游戏结束,这个人成为最终的获胜者。求最终获胜的人的位置。
分析:用双向队列模拟即可
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+10; ll a[N]; int main(){ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); ll n;cin>>n; ll k;cin>>k; deque<pair<ll,ll>>d; ll c=0,dd=0; for(int i=1;i<=n;i++){ cin>>a[i]; d.push_back({a[i],i}); } ll ans=0,w=1; while(ans<=2e6+10){ auto k1=d.front();d.pop_front(); auto k2=d.front();d.pop_front(); if(k1.first>=k2.first){ ans++; w=k1.second; d.push_front(k1); d.push_back(k2); } else{ ans=1;w=k2.second; d.push_front(k2); d.push_back(k1); } if(ans==k){ cout<<w<<endl;return 0; } } cout<<d.front().second<<endl; }