【传送门:BZOJ2697】
简要题意:
有k种情况,n个格子,第i个格子选择第j种情况的价值是出现第j种情况的上一次位置到i的距离*C[i],第一次出现价值为0,求出最大价值
题解:
贪心
首先加入在1和3和5选择第j种情况的价值,和在1和5选择第j种情况的价值是一样的
所以我们要让C[i]尽量大的放在1和n
这样子就先将C数组排序一遍,然后从大到小放在首尾就行了
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int a[310]; int main() { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=k;i++) scanf("%d",&a[i]); sort(a+1,a+k+1); int l=1,r=n,ans=0; for(int i=k;i>=1;i--) { ans+=(r-l)*a[i]; l++;r--;if(l>r) break; } printf("%d ",ans); return 0; }