首页 > 其他 > 详细

【NOIP2018】龙虎斗

时间:2018-11-25 22:07:10      阅读:259      评论:0      收藏:0      [点我收藏+]

 

 

技术分享图片

技术分享图片

技术分享图片

 技术分享图片

技术分享图片

 

 

 【题意】

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

 

【NOIP2018】龙虎斗

原文:https://www.cnblogs.com/klarkxy/p/10017398.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!