976 AlvinZH想回家

思路

如果在第i小时有一些飞机延误,那么一架飞机的c值越大,这一小时产生的损失也越大。而使这一小时产生的损失尽可能的小并不会导致接下来时间产生的损失增大。因此应当每一小时都找出要飞的飞机中c值最大的飞走,即贪心思想

题目有要求,第k+i小时,应该从1~k+i架航班中未飞出的航班中选出ci最大的飞走.

由于需要将找出数据中的最大值、去掉数据中最大值,可以考虑使用优先队列

贪心证明: 设序号为i的飞机起飞时间为di,则cost=∑(di-i)_ci=∑di_ci-∑i*ci. 显然后一项为常数,而d(i)为[k+1,k+n]的一个排列,所以只要使ci越大的i尽可能早起飞即可使得cost最小。

可以输入完之后再处理,见参考代码一。一般输入一边处理,见参考代码二。思想相同,并无差别。

参考代码一

//
// Created by AlvinZH on 2017/11/6.
// Copyright (c) AlvinZH. All rights reserved.
// #include <cstdio>
#include <queue>
using namespace std; struct Flight
{
int c, id;
bool operator<(const Flight& b) const {
return c < b.c;
}
}F[500005], t; int n, k;
long long ans;
priority_queue<Flight> Q; int main()
{
while(~scanf("%d%d",&n,&k))
{
ans = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d", &F[i].c);
F[i].id = i;
}
for(int i = 1; i <= k; i++)
Q.push(F[i]);
for(int i = k+1; i <= k+n; i++)
{
if(i <= n)
Q.push(F[i]);
t = Q.top();
Q.pop();
ans += (long long)t.c * (i-t.id);
}
printf("%lld\n", ans);
}
}

参考代码二

//
// Created by AlvinZH on 2017/11/6.
// Copyright (c) AlvinZH. All rights reserved.
// #include <cstdio>
#include <queue>
using namespace std; struct Flight
{
int c, id;
Flight(int c, int id):c(c), id(id) {}
bool operator < (const Flight& b) const {
return c < b.c;
}
}; int n, k, c;
long long ans;
Flight F(0,0);
priority_queue<Flight> Q; int main()
{
while(~scanf("%d%d",&n,&k))
{
ans = 0;
for(int i = 1; i <= n + k; i++)
{
if(i <= n)
{
scanf("%d", &F.c);
F.id = i;
Q.push(F);
}
if(i >= k+1)//开始处理
{
F = Q.top();
Q.pop();
ans += (long long)F.c * (i-F.id);
}
}
printf("%lld\n", ans);
}
}

976 AlvinZH想回家(背包DP大作战T)的更多相关文章

  1. AlvinZH掉坑系列讲解(背包DP大作战H~M)

    本文由AlvinZH所写,欢迎学习引用,如有错误或更优化方法,欢迎讨论,联系方式QQ:1329284394. 前言 动态规划(Dynamic Programming),是一个神奇的东西.DP只能意会, ...

  2. 963 AlvinZH打怪刷经验(背包DP大作战R)

    963 AlvinZH打怪刷经验 思路 这不是一道普通的01背包题.大家仔细观察数据的范围,可以发现如果按常理来的话,背包容量特别大,你也会TLE. 方法一:考虑01背包的一个常数优化----作用甚微 ...

  3. 977 AlvinZH过生日(背包DP大作战S)

    977 AlvinZH过生日 思路 难题.逆推DP. 要明确dp的状态只与是否有选择权有关,而与选择权在谁手里无关.因为不论选择权在谁手里,那个人都会尽可能的获得最大的蛋糕重量. dp[i]表示分配到 ...

  4. 991 AlvinZH的奇幻猜想----整数乘积plus(背包DP大作战P)

    914 AlvinZH的奇幻猜想----整数乘积puls 思路 难题.动态规划. 将数字串按字符串输入,处理起来更方便些. dp[i][j]:表示str[0~i]中插入j个乘号时的乘积最大值.状态转移 ...

  5. 906 AlvinZH的奇幻猜想----整数乘积(背包DP大作战O)

    906 AlvinZH的奇幻猜想----整数乘积 思路 难题.动态规划. 将数字串按字符串输入,处理起来更方便些. dp[i][j]:表示str[0~i]中插入j个乘号时的乘积最大值.状态转移方程为: ...

  6. 851 AlvinZH的鬼畜密码(背包DP大作战N)

    851 AlvinZH的鬼畜密码 思路 难题.动态规划. 先判断字符串是否合理(可翻译),然后分段处理,每一小段用动态规划求出解法数. dp[i]:字符串str[0~i]的解法数.通过判断str[i] ...

  7. DP大作战—组合背包

    题目描述 组合背包:有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包). DD大牛的伪代码 for i = 1 to N if 第i件物品属 ...

  8. DP大作战——多重背包

    题目描述 在之前的上机中,零崎已经出过了01背包和完全背包,也介绍了使用-1初始化容量限定背包必须装满这种小技巧,接下来的背包问题相对有些难度,可以说是01背包和完全背包的进阶问题. 多重背包:物品可 ...

  9. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

随机推荐

  1. Java中的并发工具类:CountDownLatch、CyclicBarrier和Semaphore

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 一. ...

  2. Python正则表达式的七个使用范例-乾颐堂

    作为一个概念而言,正则表达式对于Python来说并不是独有的.但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别. 本文是一系列关于Python正则表达式文章的其中一部分.在这个系列 ...

  3. js 获取ur参数 只要问号后面的那段传进url

    //获取url中的参数 function getUrlParam (pName, win) { var sUrl; if (typeof (win) == 'string') { sUrl = win ...

  4. java Long、Integer 、Double、Boolean类型 不能直接比较

    测试: System.out.println(new Long(1000)==new Long(1000)); System.out.println(new Integer(1000)==new In ...

  5. Linux下oracle定时备份

    1. 设置数据库空表可导出(oracel11g) 用PL/SQL登录数据库(或者其他工具) 执行: select 'alter table '||table_name||' allocate exte ...

  6. 对于nginx为什么能提高性能

    对于后端是动态服务来说,比如Java和PHP.这类服务器(如JBoss和PHP-FPM)的IO处理能力往往不高.Nginx有个好处是它会把Request在读取完整之前buffer住,这样交给后端的就是 ...

  7. ibatis源码学习3_源码包结构

    ibatis的技术是从xml里面字符串转换成JAVA对象,对象填充JDBC的statement查询,然后从resultset取对象返回,另外利用ThreadLocal实现线程安全,JDBC保证了事务控 ...

  8. Delphi 10.1.2 berlin开发跨平台APP的几点经验

    1.ios不允许app有退出功能,所以不能调用Application.Terminate. 2.info.plist文件的自定义:info.plist文件是由info.plist.TemplateiO ...

  9. 在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数)

    //在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数) function formatNum(num ...

  10. C# 数字转换成汉字大写 数值转换成汉字大写

    1.数字转换成汉字大写 public string NumToChinese(string x) { //数字转换为中文后的数组 //转载请注明来自 http://www.shang11.com st ...