其他分享
首页 > 其他分享> > P3918 [国家集训队]特技飞行

P3918 [国家集训队]特技飞行

作者:互联网

题目描述

神犇航空开展了一项载客特技飞行业务。每次飞行长 \(n\) 个单位时间,每个单位时间可以进行一项特技动作,可选的动作有 \(k\) 种,每种动作有一个刺激程度 \(c_i\)​。如果连续进行相同的动作,乘客会感到厌倦,所以定义某次动作的价值为(距上次该动作的时间) \(\times c_i\)​,若为第一次进行该动作,价值为 \(0\)。安排一种方案,使得总价值最大。

思路

1.每个动作最多两次

证明:假设动作\(c\)在\(i,j,k\)三个时刻进行,那么收益是\((k-j)\times c + (j-i)\times c = (k-i)\times c\),所以中间时刻\(j\)形同虚设。

2.每次安排在两头,这样可以最大限度的使时间间隔最大

证明:易得

3.应该从大到小开始安排

证明:易得

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<iomanip>

#define N 1010
using namespace std;
int m,n,c[N];
int ans=0;

long long read(){
	long long x=0,h=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')h=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+(long long)(ch-'0');ch=getchar();}
	return x*h;
}

int main(){
	m=read(); n=read();
	for(int i=1;i<=n;i++)c[i]=read();
	
	sort(c+1,c+n+1);
	
	for(int i=n,j=m-1;i>=1&&j>0;i--,j-=2){
		ans+=(c[i]*j);
	}
	
	cout<<ans<<endl;
	return 0;
}

标签:ch,动作,int,long,times,特技飞行,include,国家集训队,P3918
来源: https://www.cnblogs.com/ChariskFOD/p/15961245.html