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