codeforce 853A Planning

题目地址: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\n",sum);
    for(int i=1;i<=n;i++)
    {
        if (i-1) printf(" ");
        printf("%d",ans[i]);
        
    }
    printf("\n");
    return 0;
}

 

posted on 2017-09-08 10:54  Yxter  阅读(226)  评论(0编辑  收藏  举报

导航