题解 P4379 【[USACO18OPEN]Lemonade Line】
不敢快速排序又想要快排的速度,还不用STL的小伙伴们看这里!
小金羊终于学会了堆排以外的另外的一种排序 (打个题解巩固一下)
归并排序(mergesort):
时间复杂度和快排一样的优秀。
先说归并排序的实现:
首先我们一样的是要进行分解,以达到\(O(logn)\)の时间复杂度。
然后我们需要了解一下它的思想:
如果两个序列的顺序已经排好,于是我们合并两个序列。
emmm...由于分解到最后只有一个元素,一定满足性质。
然后合并?玄学?这咋合并?
其实比较简单。
我们取两个指针,分别指向分解的序列的两个头部,然后比较指针指向的两个元素,满足的就放进我们的辅助空间,直到有一个序列已经用完。
所以如果剩下的序列如何处置?
刚刚说了,两个序列都是有序的,如果剩下的都不满足比原先的元素满足性质(大或者小,或者结构体之类的),那么剩下的就依次都放进去就好了。
没看懂?模拟一下。
首先序列w[10086],表示奶牛想等的时间,假设6头,序列情况如下:
(假设从小到大的顺序)
//一开始
int w={6,2,3,4,5,1};
//分解第一次
w1={6,2,3},w2={4,5,1};
//分解第二次
w11={6}/*这个好了*/,w12={2,3},w21={4}/*这个也好了*/,w22={5,1};
//分解最后一次,已经分解完毕的不显示
w121={2},w122={3},w221={5},w222={1};
//所以现在序列是
w11={6},w121={2},w122={3},w21={4},w221={5},w222={1};
//接下来合并最后分解的那一拨
w11={6},w12_ok={2,3},w21={4},w22_ok={1/*来自w222*/,5};
//continue the merge
w1_ok={2,3,6/*比较到6剩下了,就放进来*/},;
w2_ok={1/*来自w22_ok*/,4/*来自w21*/,5/*from w22_ok*/};
//finally
w_ok={1/*from w2_ok*/,2/*from w1_ok...省略剩下的注释*/,3,4,5,6};
这就是归并排序的步骤。看看代码?
(仅仅是从小到大的mergesort样例模板代码)Code:
void mergesort(int l,int r)
{
if (l==r)return;//已经只剩一个元素
int mid=(l+r)>>1;//中部元素
mergesort(l,mid);//分解左边
mergesort(mid+1,r);//分解右边
int s2[r-l+1]/*辅助空间*/,p1=l,p2=mid+1,p3=1;
while (p1<=mid&&p2<=r)//没分解完
{
if (w[p1]<=w[p2])s2[p3++]=w[p1++];
else s2[p3++]=w[p2++];//以上两行是把较小的放进辅助空间
}
while (p1<=mid)s2[p3++]=w[p1++];//若有剩余,放进去
while (p2<=r)s2[p3++]=w[p2++];//若有剩余,放进去
p3=l;
for (register int i=1;i<=r-l+1;i++)
w[p3++]=s2[i];//再把排好的序列覆盖回去
}
看看这个题:

贪心策略:
先把最愿意排队的奶牛放前面,这样最不愿意排队的奶牛都吃草去了,保证队伍最小。
上代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int w[100001],num,cnt=0;
void mergesort(int l,int r)
{
if (l==r)return;//已经只剩一个元素
int mid=(l+r)>>1;//中部元素
mergesort(l,mid);//分解左边
mergesort(mid+1,r);//分解右边
int s2[r-l+1]/*辅助空间*/,p1=l,p2=mid+1,p3=1;
while (p1<=mid&&p2<=r)//没分解完
{
if (w[p1]>=w[p2])s2[p3++]=w[p1++];
else s2[p3++]=w[p2++];//以上两行是把较小的放进辅助空间
}
while (p1<=mid)s2[p3++]=w[p1++];//若有剩余,放进去
while (p2<=r)s2[p3++]=w[p2++];//若有剩余,放进去
p3=l;
for (register int i=1;i<=r-l+1;i++)
w[p3++]=s2[i];//再把排好的序列覆盖回去
}
int main()
{
scanf("%d",&num);
for (register int i=1;i<=num;i++)
scanf("%d",&w[i]);
mergesort(1,num);
for (register int i=1;i<=num;i++)
{
if (w[i]<cnt)break;
cnt++;
}
printf("%d",cnt);
return 0;
}
最后提醒大家一点:
归并排序的辅助空间需求特别大,如是特别要求或者数据范围特别大,请小心使用。
题解 P4379 【[USACO18OPEN]Lemonade Line】的更多相关文章
- 洛谷 P4379 [USACO18OPEN]Lemonade Line
P4379 [USACO18OPEN]Lemonade Line 题目描述 这是农场上一个炎热的夏日,Farmer John要给他的 NN 头奶牛发柠檬汽水了!所有的 NN 头奶牛(方便起见,编号为 ...
- 2019 GDUT Rating Contest III : Problem D. Lemonade Line
题面: D. Lemonade Line Input file: standard input Output file: standard output Time limit: 1 second Memo ...
- PAT甲题题解-1014. Waiting in Line (30)-模拟,优先级队列
题意:n个窗口,每个窗口可以排m人.有k为顾客需要办理业务,给出了每个客户的办理业务时间.银行在8点开始服务,如果窗口都排满了,客户就得在黄线外等候.如果有一个窗口用户服务结束,黄线外的客户就进来一个 ...
- Codeforces 549G Happy Line[问题转换 sort]
G. Happy Line time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- ACM团队周赛题解(1)
这次周赛题目拉了CF315和CF349两套题. 因为我代码模板较长,便只放出关键代码部分 #define ll long long #define MMT(s,a) memset(s, a, size ...
- EXAM-2018-7-24
EXAM-2018-7-24 未完成 [ ] G 签到水题 A J F A:英文字母有2426个 J:注意long long D:Transit Tree Path 我直接套了单源最短路的一个模板,有 ...
- 【杂题1】USACO 2018 Open Contest-练习
https://www.xoj.red/contests/show/1231 下面会写一些题目的解析什么的,当然不会粘贴题目只是简单提一下 (部分题目简单的题目就不概括了) 其实难度应该前面比较低. ...
- Lintcode394 Coins in a Line solution 题解
[题目描述] There are n coins in a line. Two players take turns to take one or two coins from right side ...
- Lintcode395 Coins in a Line II solution 题解
[题目描述] There are n coins with different value in a line. Two players take turns to take one or two c ...
随机推荐
- 【Python Learning第一篇】Linux命令学习及Vim命令的使用
学了两天,终于把基本命令学完了,掌握以后可以当半个程序员了♪(^∇^*) 此文是一篇备忘录或者查询笔记,如果哪位大佬看上了并且非常嫌弃的话,还请大佬不吝赐教,多多包涵 以下是我上课做的一些笔记,非常的 ...
- ubuntu18.04上的draftsight 2D的安装
1: 先安装draftsight 需要的支持库 sudo apt-get install libuuid1:i386 libice6:i386 libsm6:i386 libxt6:i386 liba ...
- FATAL ERROR: Tried to use mysqladmin in group......
解决办法,#export PATH=$PATH:/usr/bin
- 前端开发利器 livereload -- 从此告别浏览器F5键
各位从事前端开发的童鞋们,大家每天coding && coding,然后F5 && F5,今天推荐一个静态文件在浏览器中自动更新的扩展 livereload,不同手动刷 ...
- 基于Ubuntu+kodexplorer可道云的私有云网盘
1.可用的服务器:组装PC机一台,操作系统为Ubuntu 14.04 LTS,无桌面环境,放在机房,使用远程终端进行访问.有安装了Apache2,运行着svn服务.内网IP地址为192.168.0.1 ...
- GlusterFS分布式存储集群-2. 使用
参考文档: Quick Start Guide:http://gluster.readthedocs.io/en/latest/Quick-Start-Guide/Quickstart/ Instal ...
- 局域网arpspoof欺骗获取cookie/图片/密码
开启路由转发功能 查看IP转发功能是否打开 默认是不开起,0,我这里是修改后的,显示1. 修改转发功能,1为允许. 修改成功后再进行Arpspoof欺骗 如果开始劫持后,自己电脑无法联网了 ??? 检 ...
- NodeJS http模块
Node.js提供了http模块,用于搭建HTTP服务端和客户端. 创建Web服务器 /** * node-http 服务端 */ let http = require('http'); let ur ...
- python之multiprocessing创建进程
python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. multiprocessing创建多进程在windows和linux系统下的 ...
- 一个demo 理解 vuex
相比接触vue的同学们已经看了官方文档了.这里我用一个简单的demo来阐述下vuex的知识点,虽然简单,但是容易理解.也加深自己的记忆. 用脚手架建立个项目vue init webpakc-simpl ...