有n个石子围成一圈,每个石子都有一个权值a[i],你需要取一些石子,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有n个石子围成一圈,每个石子都有一个权值a[i],你需要取一些石子,相关的知识,希望对你有一定的参考价值。

题解 - Solution

有n个石子围成一圈,每个石子都有一个权值a[i],你需要取一些石子,每个石子的得分是a[i]*d,d表示这个石子到两边被取了的石子的距离和。
现在你可以取若干石子,使得分最大。

不难证明,取三个及其以上的石子必然不能得到最优解。
用贪心法,要么取一个最大值,要么取两个最大值。
注意数据大小,要用int64或longlong。
===================================================================
NOI导刊的题,不多说注意2点:1. 数据范围 int 64
            2.贪心即可 不用动归!(快排+贪心)==AC

qi求证!题解方法谢谢

参考技术A 我不是很清楚你哪里不明白,我刚做完这道题,解释一下吧
先简单证明一下贪心原则:就是你说的“取三个及其以上的石子必然不能得到最优解”
设 Mi 表示第i大的权值,则:
若只选一个 答案为:(n-1)*M1..................① (这个就不解释了...)
若选取两个 答案为:(n-2)*(M1+M2).........② (可以画个图,就明白了)
若选取三个 如下图,x表示权值为M2的点与权值为M3的点之间有x个点,y,z同理
M1
z y
M2 x M3 <---- 假装这是个圆形....且x+y+z+3=n
答案为:(y+z)*M1 + (x+z)*M2 + (x+y)*M3..........③

用⑤-③得 (n-2-y-z)*M1 + (n-2-x-z)*M2 - (x+y)*M3
= (x+3)*M1 + (y+3)*M2 - (x+y)*M3
= (M1-M3)*x + (M2-M3)*y + 3*(M1+M2)
> 0 // M1>=M2>=M3>0
即 ② > ③
当取更多点的时候,同理可得②更优(或者自己脑子里想一想)
也就是说,答案将在 ① 和 ② 中产生,所以在读入的时候比大小,记录第一大和第二大的值
最后比较 (n-1)*M1 和 (n-2)*(M1+M2) 的大小并输出即可
时间复杂度是 O(n) 的
空间复杂度可以做到 O(1) , 就是每次读入比较大小,不需要用数组存值
核心代码如下 // 我学C的,但代码很简单很简单....
for( i=1; i<=n; i++ )

scanf("%I64d",&value);
if(value>max1)

max2 = max1;
max1 = value;

else if(value>max2) max2 = value;


然后比个大小就可以了
所以说,不需要快排,(那会麻烦死的)

以上是关于有n个石子围成一圈,每个石子都有一个权值a[i],你需要取一些石子,的主要内容,如果未能解决你的问题,请参考以下文章

两个人取一圈石子谁最后取完就赢了

石子合并

2022-05-03:Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第

[GDOI2017] 取石子游戏(LCA)

c语言,有n个人围成一个圈,顺序排号,从第一个开始报数(1到3),凡报到3的退出圈子问最后留下的人

luogu P1880ybtoj 区间DP课堂过关 例题1石子合并 & [NOI1995] 石子合并