【BZOJ2697】特技飞行(好久没做过这么水的题了,所以我为何还要水博客)

点此看题面

大致题意:\(n\)个单位时间,每个单位时间可以在\(k\)个动作中选择一个。一个动作的价值是(这次出现时间-上次出现时间)×这个动作的愉悦值【若一个动作第一次出现则价值为0】。求所能得到价值总和的最大值。

前言

做那种高思维强度的题目做得脑壳疼,于是就来做水题轻松一下

这在洛谷上仅仅是一道\(\color{green}{绿题}\)写到这里突然有种颓废般的罪恶感),感觉我是不是已经开始自暴自弃了啊。

大致思路

显然,根据它的计算方式,一个动作出现多次的价值其实就等同于只保留首尾两次出现时的价值。

于是我们就想到把动作按愉悦值从大到小排序,从首尾两侧同时开始摆,直到摆不了为止。然后此时的价值总和就是答案。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts tmeplate<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define K 300
using namespace std;
int n,k,a[K+5];I bool cmp(CI x,CI y) {return x>y;}//从大到小排序
int main()
{
	RI i;for(scanf("%d%d",&n,&k),i=1;i<=k;++i) scanf("%d",a+i);
	RI ans=0;sort(a+1,a+k+1,cmp);
	for(i=1;i<=min(k,n/2);++i) ans+=a[i]*(n-2*i+1);//从首尾两侧开始摆
	return printf("%d",ans),0;
}

猜你喜欢

转载自www.cnblogs.com/chenxiaoran666/p/BZOJ2697.html