题解 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 ...
随机推荐
- Excel表格生成sql语句
假如excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age ,在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...
- django 部署一个简单的博客系统
转:https://www.cnblogs.com/fnng/p/3737964.html 写的目的, 加深影响,熟悉开发流程, 开发都是练出来的. 环境 python3.5 windows 7 1. ...
- 使用VMWareWorkstation10搭建学习环境笔记
第一节:介绍虚拟化技术 虚拟化技术1.在一台计算机运行多个操作系统2.教学环境 测试环境3.和硬件无关4.P to V 物理机->虚拟机(Physical to Virtual) V ...
- linux镜像(持续更新)
Linux系统历史衍生图:https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg ubu ...
- 利用VS2015开发python版本的caffe应用
打开VS2015,选择“新建项目”->“其它语言”->“python”,VS会提示你安装PTVS(Python Tools for Visual Studio)插件,安装完毕后即可开始py ...
- 布线问题 (NYOJ38)
布线问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有 ...
- Kubernetes网络方案 Flannel和calico
摘抄某博客 1. Flannel Flannel是为kubernetes设计的一个非常简洁的多节点三层网络方案,解决不同host上的容器互联问题,原理是为每个host分配一个subnet,容器从此 ...
- kuberentes 源码编译安装
下载源码 git clone https://github.com/kubernetes/kubernetes && cd kubernetes # 切换版本分支 git checko ...
- 深入理解List集合框架底层原理的实现
前言: 此篇文章讲解ArrayList和LinkedList底层实现原理.for和foreach遍历集合哪个效率会更高一些! 讲讲什么是集合框架?集合框架是为表示和操作集合而规定的一种统一的标准的体系 ...
- 在NodeJS中使用Redis缓存数据
Redis数据库采用极简的设计思想,最新版的源码包还不到2Mb.其在使用上也有别于一般的数据库. node_redis redis驱动程序多使用 node_redis 此模块可搭载官方的 hiredi ...