题目链接:

运输问题

问题分析:

初读题目,可能有点搞不懂。题目要求:二当一(两件的价格算一件),并且给出了这个价格是如何计算的。题目的关键点在:如此反复。直到只收一件商品的钱。 分析到这,是否感觉有点类似哈夫曼编码以及洛谷中的另一道贪心习题-合并果子?
按照这个思路,写出如下的代码:

#include<iostream>
#include<algorithm>
using namespace std;bool cmp(int a, int b){return b < a;
}int main(){int n, k;cin >> n >> k;int ars[n];for(int i = 0; i < n; i++)cin >> ars[i]; sort(ars, ars+n, cmp);for(int i = 0, j; i < n-1; i++){//如题解,每次选取最大两个值进行运算(合并果子?) ars[i+1] = (ars[i] + ars[i+1]) / k; int t = ars[i+1];for(j = i+2; j < n && t < ars[j]; j++){//为新值找合适位置 ars[j-1] = ars[j];//向前移动 }ars[j-1] = t;}cout << ars[n-1];return 0;
}

提交后发现,思路正确。但是不禁有两个疑问:a.为什么采取上述策略可以有效解决问题呢?b.上述代码的时间复杂度显然是O(n^2),耗时的操作主要浪费在为新值寻找合适位置上了。是否存在有效的解决方案降低时间复杂度呢?看了很多博文,大佬们用的都是优先队列,不妨通过此类题目学习一下优先级队列。按照上述两个疑问,本篇博文一下将分别分析。

疑问A分析:

题目要求运费最少,则最优解为运费最少的情况。分析运费的计算情况,如何让运费最少?我们不妨将上述新运费计算方式当作一种打折活动,买东西时,我们自然希望贵重的物品的折扣越大越好,或者打的折扣次数尽量多。回到本题,若每次最贵重的物品参与的/k次数越多,最终的费用也不久最少吗?相比选择便宜的物品,打相同次数的折扣自然要比贵重物品少很多。因此问题不难得证。

优先级队列:

其使用方法同普通队列没有什么区别,先看下其一般使用方法:

#include<bits/stdc++.h>
using namespace std;int main(){priority_queue<int>que;queue<int> q;for(int i = 0; i < 10; i++){int t = rand() % 10;q.push(t);que.push(t);}cout << "priority_queue:" << endl;  for(int i = 0; i < 10; i++){cout << que.top() << " ";que.pop();}cout << "\nqueue:" << endl;for(int i = 0; i < 10; i++){cout << q.front() << " ";q.pop();}return 0;
}

通队列基本没有什么区别,不同的是,其是按序排列的。通过上述实践,也可以发现:优先级队列默认按最大值优先的顺序。
倘若我们想改变优先级顺序,该如何实现?c++提供了自带的库函数,当然我们也可以自定义。先看下自带的库函数操作:

#include<bits/stdc++.h>
using namespace std;int main(){priority_queue<int, vector<int>, greater<int> > que_greater;priority_queue<int, vector<int>, less<int> > que_less;//默认效果 priority_queue<int, vector<int>, equal_to<int> > que_equal_to;priority_queue<int, vector<int>, greater_equal<int> > que_greater_equal;priority_queue<int, vector<int>, less_equal<int> > que_less_equal;for(int i = 0; i < 10; i++){int t = rand() % 10;que_greater.push(t);que_less.push(t);que_equal_to.push(t);que_greater_equal.push(t);que_less_equal.push(t);}cout << "greater:" << endl;for(int i = 0; i < 10; i++){cout << que_greater.top() << " ";que_greater.pop();}cout << "\nque_greater_equal:" << endl;for(int i = 0; i < 10; i++){cout << que_greater_equal.top() << " ";que_greater_equal.pop();}return 0;
}

自定义比较操作:

#include<bits/stdc++.h>
using namespace std;struct cmp1{bool operator()(int &a, int &b){return a < b;}
};
struct cmp2{bool operator()(int &a, int &b){return a > b;}
};int main(){priority_queue<int, vector<int>, cmp1> que_cmp1;priority_queue<int, vector<int>, cmp2> que_cmp2;for(int i = 0; i < 10; i++){int t = rand() % 10;que_cmp1.push(t);que_cmp2.push(t);}cout << "cmp1:\n";for(int i = 0; i < 10; i++){cout << que_cmp1.top() << " ";que_cmp1.pop();}cout << "\ncmp2:\n";for(int i = 0; i < 10; i++){cout << que_cmp2.top() << " ";que_cmp2.pop();}return 0;
}

将上述题目用优先级队列重写一下:

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;int main(){int n, k;cin >> n >> k;priority_queue<int>que;for(int i = 0; i < n; i++){int t;cin >> t;que.push(t);}for(int i = 0, j; i < n-1; i++){int x, y, z;x = que.top();que.pop();y = que.top();que.pop();z = (x+y) / k;que.push(z);}cout << que.top();return 0;
}

关于优先级队列更多细节可移步大佬博客:
优先级队列(上)
优先级队列(下)

洛谷-运输(P2094)相关推荐

  1. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  2. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

  3. 洛谷P3237 [HNOI2014]米特运输 题解

    洛谷P3237 [HNOI2014]米特运输 题解 题目链接:P3237 [HNOI2014]米特运输 题意: 这题面是真的长啊 qwq 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为 ...

  4. 洛谷P1007——独木桥 解法 (C++)

    Hi 又见面了呀 今天来一道洛谷的题 独木桥 先上个题目传送门(点击蓝字即可观看) 注:该博客已在2020年6月24日更新,更新内容:修复了一些由于字体原因导致的错误 题目背景 战争已经进入到紧要时间 ...

  5. 洛谷大起义胜利的经验总结

    UPD1(2019.7.11):chen_zhe解除了对我的禁言,但仍保持大脑皮层对刷题重心转到LibreOJ的决策,50年不变. 2019-07-09 9:54 结束黑暗无光的\(luogu\)统治 ...

  6. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

  7. 【BZOJ3322】【洛谷P3280】【SCOI2013】摩托车交易(Kruscal重构树+贪心)

    BZOJ传送门 洛谷传送门 这道题和NOIPNOIPNOIP的那道货车运输有区别吗 做一个KruscalKruscalKruscal重构树就可以了 每次贪心暴力尽量选就是了 #include<b ...

  8. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  9. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

最新文章

  1. access哪个速度快 vfp_大学计算机二级考试,报考哪个科目比较好?
  2. cacti监控服务器的数据迁移
  3. echarts饼图扇区添加点击事件
  4. linkedhashmap获取第n个元素_机试真题分享——交换链表前后第K个元素
  5. Android开发杂谈更新中
  6. Android onTouchEvent方法
  7. java拆装箱(转)
  8. 2020年电工(技师)证考试及电工(技师)模拟考试软件
  9. 腾讯会议中用PPT放视频,视频没有声音
  10. 制作简易的幸运转盘抽奖
  11. 如何把手变成手控_女生的手怎样变好看?
  12. MSP430加密代码保护
  13. 密码要包含大小写字母+数字+符号,提这个建议的人刚刚承认他错了
  14. 《西部世界》暗示了大数据人工智能什么
  15. 营业执照遗失该如何处理
  16. 12306 流程解析
  17. JS 【详解】作用域
  18. python读写文件is和==区别常用模块
  19. ipynb转python(.py)
  20. 通过PS制作手机图标心得总结

热门文章

  1. find_element()和find_elements()的区别
  2. 文件服务器迁移方法,文件服务器迁移工具
  3. word中插入图片,转pdf后,打印的图片出现阴影模糊的问题及处理办法
  4. 修改本机的 Host 文件
  5. android studio依赖关系图,Android studio 如何查看 library 间的依赖关系
  6. Android客户端Monkey稳定性测试
  7. mysql distinct 优化_SQL优化终于干掉了“distinct”
  8. linux系统管理与服务器配置高志君_Linux系统管理与服务器配置
  9. 《人工智能及其应用》课程笔记(四)第4章 非经典推理
  10. wasc honeypot