题解 P5016 【龙虎斗 】

1|0noip考完了,祝大家取的一个好成绩,期中考rp++;

1|1这道题目读懂题意后就非常简单了:

​ 给出n个数,再给出一个m位置,定义ab,(m不属于ab):a1m1个数每个数用这个数到m的距离乘这个数的积之和,b则为m+1n中再在这n个每个数用这个数到m的距离乘这个数的积之和,然后在其中一个位置(p1)加入了一个数(s1),现在再给你一个数(s2),求这个数加在哪一个位置能让ab的差最小(加上去这个数的计算方法和之前相同)

1|2那么根据题意我们可以总结出这道题的思路了

:此时的ab我们已经加上了s1(a||b),abs为绝对值

  1. 先把s1加到p1位置上,然后根据题意计算ab的值

定义一个minn,用于更新最小差值,在定义一个ans用来更新能产生最小差值的位置

  1. 因为题目中说s2可以放在m上,而m上的值不影响ab值,所以想让差值最小,可以先考虑一下最小差值为abs(ab)的情况,所以先把minn=abs(ab)ans=m;

  2. 因为题目的中“势力”的定义,我们并不能得出a<b则最小差值的位置就在a区间内的结论,这个数到m点的距离会影响“势力”的值。所以只能暴力枚举从1~n的每一个位置

我们拿枚举1m1(即a区间)内的位置举例:

for(int i=1;i<m;i++) { if(abs(s2*(m-i)+a-b)<minn){ minn=abs(s2*(m-i)+a-b); ans=i; } }

s2(m-i)+a即当s2的值插入到i位置时a的值

​ 这样这道题目我们就已经可以代码实现出来了

CODE:

#include<iostream> #include<cstdio> #include<cctype> #include<cmath> using namespace std; long long a[100010],s1,s2,sum2,sum1,minn; int m,n,p1,ans; inline int read() { int X=0;bool sign=0; char ch=0; while(ch<'0'||ch>'9') {sign|=(ch=='-');ch=getchar();} while(ch>='0'&&ch<='9') {X=(X<<3)+(X<<1)+(ch^48);ch=getchar();} return sign?-X:X; } inline void print(int x) { if(x<0) putchar('-'),x=-x; if(x>9) print(x/10); putchar(x%10+'0'); } int main() { n=read(); for(int i=1;i<=n;i++) a[i]=read(); m=read();p1=read();s1=read();s2=read(); a[p1]+=s1; for(int i=1;i<m;i++) //见解题思路第1点 sum1+=a[i]*(m-i); for(int i=m+1;i<=n;i++) sum2+=a[i]*(i-m); minn=abs(sum1-sum2);ans=m;//见解题思路第2点 for(int i=1;i<m;i++) //见解题思路第3点 if(abs(sum1+s2*(m-i)-sum2)<minn) { minn=abs(sum1+s2*(m-i)-sum2); ans=i; } for(int i=m+1;i<=n;i++) if(abs(sum2+s2*(i-m)-sum1)<minn){ minn=abs(sum2+s2*(i-m)-sum1); ans=i; } print(ans); }

再说些有关自己,有关这道题的事吧,这道题考场上花了近一个小时做了出来,就在要删掉freopen的注释时电脑异常关机,然后我第二题的代码就是第三题的了。申诉延时也因为认为是我个人原因而被拒绝,辛辛苦苦准备了一年的成果也就自然付之东流。我写这篇题解,也是为了证明我即使没有那道题的分数,也是有实力做出那道题的。

@洪以濠 @哲学濠 感谢你们对我的关心和开导。感谢洛谷给oier们提供了这么优秀的平台:D


__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17776999.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示