P5016 龙虎斗
链接:P5016
------------------------------------
作为2019年的模拟,还是有必要写一些的
-------------------------------------
这道题虽然就是道模拟,但是要开longlong,而且不能直接模拟,还是要略微优化一下。
(这还叫模拟?)
-------------------------------------
首先,考虑一下什么情况会放在m处
倘若本来龙和虎的气势就像等,那么自然是不用放的。
如果人数实在太多了,越放差越大,自然也是不行的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
if(s2>2*c||a==b){ cout<<m; return 0; }
----------------------------------
然后开始算一下怎么放
很容易想到,谁低给谁。
然后除一下就知道了。
-------------------------------
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; typedef long long ll; ll n,m,p1,s1,s2; ll so[100050]; ll a; ll b; int main(){ cin>>n; for(int i=1;i<=n;++i){ cin>>so[i]; } cin>>m>>p1>>s1>>s2; so[p1]+=s1; for(int i=1;i<m;++i){ a+=(so[i]*(m-i)); } for(int i=m+1;i<=n;++i){ b+=(so[i]*(i-m)); } ll c=max(a,b)-min(a,b); if(s2>2*c||a==b){ cout<<m; return 0; } else{ ll st=c/s2; if(c-(s2*st)>=(s2*(st+1)-c)){ if(a>b){ if(m+st+1<=n) cout<<m+st+1; else cout<<n; return 0; } else{ if(m-st-1>0) cout<<m-st-1; else cout<<1; return 0; } } else{ if(a>b){ if(m+st<=n) cout<<m+st; else cout<<n; return 0; } else { if(m-st>0) cout<<m-st; else cout<<1; return 0; } } } return 0; }