p4995解题报告
题目传送门 link 。
推荐个人博客内食用,效果更佳哦。
如果将本题改为最小花费,相信大家都知道按顺序跳就可以了,而最大花费也就刚好与其相反,只要在最后一个没跳过的石头和第一个没跳过的石头之间反复横跳就行了。
接着,我们要有一个准确的证明。
首先排序一下,我们便能得到一个单调递增的数组。设这个数组为
这里我们使用反证法,证明比前面所说的更优的方案不存在。
假设
对于方案一:他就是最小值,所以肯定小于方案六。
对于方案二:
而
由于数组单调递增,所以
对于方案三:
对于方案四:
对于方案五:
综上,上面提出的方案便是最优方案。
可能有的同学要问了:你这只证明了一个
代码非常简短,如有疑惑可以看看注释
#include<bits/stdc++.h>
#define int long long//防止见祖宗的神器
using namespace std;
int n;
int a[310],ans;
signed main()
{
ios::sync_with_stdio(0);//关闭同步,就可以放心的用cin,cout
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n,cmp);
int t=0,w=n;//t:头,w:尾
while(t<w)
{
ans+=(a[t]-a[w])*(a[t]-a[w]);//一次循环操作两次,也就是从最后跳到最前再跳到最后
t++;
ans+=(a[w]-a[t])*(a[w]-a[t]);
w--;
}
cout<<ans;
return 0;
}
完结撒花!