这是题目,一看题目我懵了,怎么这么长 不想读
但是把我仔细把题目读了几遍以后发现 也就是那么回事
我觉得这题很简单,就是先输入,p1位置加s1个工兵,然后依次枚举把s2个工兵放在所有的兵营里,每次算一遍双方势力之差,取最小就行了
但是写出来以后代码超时了
超时的原因实在是太简单了
原因在于每次都算了一遍势力之差。
时间复杂度是O(n^2)O(n2)
所以我考虑说
就提前算好龙方和虎方的势力之差,每次枚举的时候就直接算一下新的势力之差就行
本着不开long long见祖宗的原则 我写出了的AC代码就是下面这个了
#include <bits/stdc++.h> #define max maxx #define min minn #define ll long long using namespace std; ll n,c[100005],m,p1,s1,s2,p2; ll lon,hu; ll max(ll a,ll b) { if(a>b) return a; else return b; } ll min(ll a,ll b) { if(a<b) return a; else return b; } int main() { ll i; cin>>n; for(i=1;i<=n;i++) cin>>c[i]; cin>>m>>p1>>s1>>s2; c[p1]+=s1; for(i=1;i<m;i++) lon+=c[i]*(m-i); for(i=m+1;i<=n;i++) hu+=c[i]*(i-m); if(lon==hu) cout<<m<<endl; else if(lon<hu) { p2=m-(hu-lon)/s2; p2=max(1,p2); p2=min(n,p2); if(p2>1 && (abs(lon+s2*(m-p2+1)-hu)<=abs(hu-lon-s2*(m-p2)))) cout<<p2-1<<endl; else cout<<p2<<endl; } else { p2=m+(lon-hu)/s2; p2=max(1,p2); p2=min(n,p2); if(p2<n && (abs(hu+s2*(p2+1-m)-lon)<abs(hu+s2*(p2-m)-lon))) cout<<p2+1<<endl; else cout<<p2<<endl; } return 0; }
拜拜!!!