[latexpage]
Time Limit: 10 Sec Memory Limit: 256 MB
Description
神犇航空开展了一项载客特技飞行业务。每次飞行长N个单位时间,每个单位时间可以进行一项特技动作,可选的动作有K种,每种动作有一个刺激程度Ci。如果连续进行相同的动作,乘客会感到厌倦,所以定义某次动作的价值为(距上次该动作的时间)*Ci,若为第一次进行该动作,价值为0。安排一种方案,使得总价值最大。
Input
第一行,两个数,N和K,如上所述;
第二行,K个正整数,表示K种动作的Ci值。
第二行,K个正整数,表示K种动作的Ci值。
Output
仅一行,一个整数,表示最大总价值。
Sample Input
5 2
2 2
2 2
Sample Output
12
HINT
数据规模及约定
对于10%的测试数据,N<=20,K<=3
对于全部的测试数据,1<=N<=1000,1<=K<=300,0<=Ci<=1000。
Solution
这题可以用贪心来解决,我们发现若表演两次以上同一种特技和表演两次这种特技的价值是一样的。
设一种特技表演了x次,每次表演的时间为a[i],这种特技表演的刺激程度为c,则$价值=\sum_{i=2}^{x}(a[i]-a[i-1])*c=(a[x]-a[1])*c$,所以我们发现一种特技至多只需表演两次即可。再发现,我们让c[i]值大的两次表演的间隔时间大,我们就可以得到最大的价值。
代码如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n,k,a[305]; int main() { 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+=a[i]*(r-l); l++,r--; if (l>=r) break; } printf("%d",ans); return 0; } |