• Codeforces 854C Planning 【贪心】


    <题目链接>

    题目大意:

    表示有n架飞机本需要在[1,n]时间内起飞,一分钟只能飞一架.但是现在[1,k]时间内并不能起飞,只能在[k+1,k+n]内起飞.ci序号为i的飞机起飞延误一分钟的costi.每个飞机起飞时间不能比原定时间早,请安排一个起飞顺序,求最小的cost和。

    解题分析:

    贪心策略证明:转载于>>>
    设序号为i的飞机起飞时间为di,则cost=∑(di-i)*cj=∑di*cj-∑j*cj。显然后一项为常数,而{di-k}为[1,n]的一个排列, 所以只要使ci越大的i尽可能早起飞即可使得cost最小。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <queue>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 typedef long long ll;
     9 #define N int(3e5+10)
    10 ll ans[N];
    11 struct Node{
    12     ll loc,val;
    13     Node(ll a1,ll a2):loc(a1),val(a2){}
    14     bool operator < (const Node & tmp)const{
    15         return val<tmp.val;
    16     }   
    17 }; 
    18 int main(){
    19     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    20     priority_queue<Node>q;
    21     int n,k;cin>>n>>k;
    22     ll sum=0;
    23     for(ll i=1;i<=n+k;i++){
    24         if(i<=n){
    25             ll cal;cin>>cal;
    26             q.push(Node(i,cal));
    27         }
    28         if(i>k){
    29             Node now=q.top();q.pop();
    30             sum+=(i-now.loc)*now.val;   //起飞时间早的飞机与多的花费优先相乘
    31             ans[now.loc]=i;
    32         }
    33     }
    34     cout<<sum<<endl;
    35     for(int i=1;i<=n;i++)
    36         i==n?printf("%lld
    ",ans[i]):printf("%lld ",ans[i]);
    37 }

    2019-02-01

  • 相关阅读:
    Brackets_区间DP
    石子合并_区间Dp
    You Are the One_区间DP
    Palindrome subsequence_区间DP
    Infix to postfix 用stack模板,表达式没有括号
    Java 4
    Java 3
    规范化的递归转换成非递归
    recursion 递归以及递归的缺点
    Infix to postfix conversion 中缀表达式转换为后缀表达式
  • 原文地址:https://www.cnblogs.com/00isok/p/10349210.html
Copyright © 2020-2023  润新知