把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【BZOJ2697】特技飞行(大水题)

点此看题面

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

前言

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

大致思路

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

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

代码

#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;
}
posted @ 2020-05-18 14:21  TheLostWeak  阅读(119)  评论(0编辑  收藏  举报