【NOIP2018】龙虎斗

 

 【题意】

直接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 long long 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 }

猜你喜欢

转载自www.cnblogs.com/klarkxy/p/10017398.html