题目地址:http://codeforces.com/problemset/problem/853/A
题目大意:
本来安排了 n 架飞机,每架飞机有 ci 的重要度,
第 i 架飞机的起飞时间为 i ,而现在,在 k 时之前不能有任何飞机起飞,每个时间点只有1架飞机能起飞,
损失=(飞机现起飞时间-飞机原起飞时间)*该飞机的重要度.
现在要求你排一张时间表,要求每架飞机都只能在原起飞时间及以后起飞,且使损失最小.
题解:
贪心
暴力的数组模拟tle,o(≧口≦)o
#include<bits/stdc++.h> using namespace std; int n,k; struct node { int id; long long c; }a[300005]; int b[300005],ans[300005]; bool vis[300005]; long long sum; bool cmp(node a,node b) { if (a.c!=b.c) return a.c>b.c; else return a.id>b.id; } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i].c); a[i].id=i; } sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++) {b[i]=k+i; vis[i]=0;} sum=0; for(int i=1;i<=n;i++) { int t=0; while(1) { int kk=lower_bound(b+t+1,b+1+n,a[i].id)-b; if (!vis[kk]) { vis[kk]=1; sum+=(b[kk]-a[i].id)*a[i].c; ans[a[i].id]=b[kk]; break;} else t=kk; } } printf("%lld ",sum); for(int i=1;i<=n;i++) { if (i-1) printf(" "); printf("%d",ans[i]); } printf(" "); return 0; }