【NOIP2018】龍虎鬥
阿新 • • 發佈:2018-11-25
【題意】
直接a[p1]+=s1
求一個p2,使得a[p2]+=s2後,abs{∑(m-i)*a[i]}最小
【解法】
求出S=∑(m-i)*a[i]
當S<0時,對[1..m)進行列舉
當S>0時,對(m,n]進行列舉
minS的初始值為當i=m時,minS=S
注意,所有變數都需要longlong
【程式碼】
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef longlong ll; 4 const int N = 100000+5; 5 ll n; 6 ll c[N]; 7 ll m,p1,s1,s2; 8 int main() 9 { 10 scanf("%lld",&n); 11 for (int i=1;i<=n;i++) 12 scanf("%lld",&c[i]); 13 scanf("%lld%lld%lld%lld",&m,&p1,&s1,&s2); 14 c[p1]+=s1; 15 ll x=0; 16 for (ll i=1;i<=n;i++) 17 x+=(m-i)*c[i]; 18 ll mm=(x>0)?x:(-x),k=m; 19 for (ll i=1;i<=n;i++) 20 { 21 ll xx=x+(m-i)*s2; 22 if (xx<0) xx=-xx; 23 if (xx<mm) 24 { 25 mm=xx,k=i; 26 } 27 } 28 printf("%lld",k); 29 }