Luogu P2827 [NOIp2016提高组]蚯蚓 | 神奇的队列
80分思路:
弄一个优先队列,不停地模拟,切蚯蚓时就将最长的那一条出队,然后一分为二入队,简单模拟即可。还要弄一个标记,表示从开始到当前时间每一条蚯蚓应该加上的长度,操作时就加上,入队时就减去,输出时也要加上,这样就不用一个一个加了。
80分代码:(注意:手打堆貌似会更快一些,能拿到85分左右,原理跟优先队列一样)
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<string>
#include<sstream>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<int> d;
int main()
{
int n=0,m=0,q=0,t=0,k=0;
double u=0,v=0;
scanf("%d%d%d%lf%lf%d",&n,&m,&q,&u,&v,&t);
for(int i=1;i<=n;i++)
{
int a=0;
scanf("%d",&a);
d.push(a);//入队
}
for(int i=1;i<=m;i++)
{
int w=d.top(),l1=0,l2=0;
d.pop();
w+=k;//加上标记
k+=q;//更新标记
l1=w*(u/v);//计算长度
l2=w-l1;
d.push(l1-k);//一分为二入队
d.push(l2-k);
if(i%t==0) printf("%d ",w);//同时输出这一秒切的蚯蚓的长度
}
printf("\n");//换行
for(int i=1;i<=n+m;i++)
{
if(i%t==0) printf("%d ",d.top()+k);//输出m秒后每一条蚯蚓的长度
d.pop();//队首元素出队
}
printf("\n");//换行
return 0;
}
100分思路:
三队列模拟。
第一个队列存放原始的蚯蚓长度(已从大到小排序)。
第二个队列存放蚯蚓被切后的一份的长度([px])。
第三个队列存放蚯蚓被切后的另一份的长度(x-[px])。
每次在三个队列的队头中取一个最大值并将其出队,然后将其分成两份分别存在第二、三个队列里。
因为每一次我们都是切最长的,而当我们切下一条时两条原来属于上一条的蚯蚓又会增长,所以先切一定大于后切的,第二、三个队列也就是单调递减的了。
除此之外,还要加一个标记,记录当前每一条蚯蚓应增加的长度,操作时就加上,入队时就减去,输出时也要加上,这样就不用一个一个加了。
AC代码:
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<string>
#include<sstream>
#include<cstring>
using namespace std;
struct duilie//手打队列
{
int head;//队首
int tail;//队尾
int d[7100005];//队列
}dl[3];
int main()
{
dl[0].head=dl[1].head=dl[2].head=1;//初始化队首队尾
dl[0].tail=dl[1].tail=dl[2].tail=1;
int n=0,m=0,q=0,t=0,k=0;
double u=0,v=0;
scanf("%d%d%d%lf%lf%d",&n,&m,&q,&u,&v,&t);
for(int i=1;i<=n;i++)
{
int a=0;
scanf("%d",&a);
dl[0].d[dl[0].tail++]=a;//入队
}
sort(dl[0].d+dl[0].head,dl[0].d+dl[0].tail,greater<int>());//从大到小排序
for(int i=1;i<=m;i++)
{
int x=-2147483647,y=0,l1=0,l2=0;
for(int j=0;j<3;j++)//在三个队首中取最大值
if(dl[j].head<dl[j].tail&&dl[j].d[dl[j].head]>x)
{
x=dl[j].d[dl[j].head];
y=j;
}
dl[y].head++;//将最大值出队
x+=k;//加上当前标记
k+=q;//更新标记
l1=x*(u/v);//计算一段蚯蚓的长度
l2=x-l1;//计算另一段蚯蚓的长度
dl[1].d[dl[1].tail++]=l1-k;//分别入队
dl[2].d[dl[2].tail++]=l2-k;
if(i%t==0) printf("%d ",x);//同时输出这一秒切的蚯蚓的长度
}
printf("\n");//记得换行
for(int i=1;i<=n+m;i++)//输出m秒后每只蚯蚓的长度
{
int x=-2147483647,y=0;
for(int j=0;j<3;j++)//在队首中取最大值
if(dl[j].head<dl[j].tail&&dl[j].d[dl[j].head]>x)
{
x=dl[j].d[dl[j].head];
y=j;
}
dl[y].head++;//将最大值出队
if(i%t==0) printf("%d ",x+k);//输出
}
printf("\n");//记得换行
return 0;
}
Luogu P2827 [NOIp2016提高组]蚯蚓 | 神奇的队列的更多相关文章
- 洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)
容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.del ...
- Noip2016 提高组 蚯蚓
刚看到这道题:这题直接用堆+模拟不就可以了(并没有认真算时间复杂度) 于是用priority_queue水到了85分-- (STL大法好) 天真的我还以为是常数问题,于是疯狂卡常--(我是ZZ) 直到 ...
- [NOIp2016提高组]蚯蚓
题目大意: 给你n个不同长度蚯蚓,每秒从里面取出最长的砍下u/v变成两只,又把剩下的加长q. 问你在m之前的t,2t,3t...的时间上,砍的蚯蚓长度, 以及m秒后剩下所有的蚯蚓长度. 思路: 很容易 ...
- Luogu P2822 [NOIp2016提高组]组合数问题 | 数学、二维前缀和
题目链接 思路:组合数就是杨辉三角,那么我们只要构造一个杨辉三角就行了.记得要取模,不然会爆.然后,再用二维前缀和统计各种情况下组合数是k的倍数的方案数.询问时直接O(1)输出即可. #include ...
- Luogu P1850 [NOIp2016提高组]换教室 | 期望dp
题目链接 思路: <1>概率与期望期望=情况①的值*情况①的概率+情况②的值*情况②的概率+--+情况n的值*情况n的概率举个例子,抛一个骰子,每一面朝上的概率都是1/6,则这一个骰子落地 ...
- Luogu P1563 [NOIp2016提高组]玩具谜题 | 模拟
题目链接 纯模拟题,没啥好说的,就是要判断地方有点多,一定要注意细节. #include<iostream> #include<cstdio> #include<fstr ...
- 【题解】NOIP2016提高组 复赛
[题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...
- 【题解】NOIP2016 提高组 简要题解
[题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
随机推荐
- k8s工作负载资源之deployment
首先我们要理解:一个应用跑在k8s集群上了,那么这个应用就是一个工作负载(workloads). 在k8s中会用pod的来承载这个应用,那么负责管理这个pod的东西就叫工作负载资源(workload ...
- element-ui的Tree树组件使用技巧
目录 1,前言 2,需求 3,解决思路 4,完整代码 5,总结 1,前言 最近这段时间在做一个新的模块,其中有一个三层的树结构,产品经理提出了一个很古怪的需求,整的我只能自己控制树的交互,写完之后,感 ...
- linux 安装配置 jdk1.8
一.查看Linux系统是否有自带的jdk: 1.输入:java -version 2.输入:rpm -qa | grep java 检测jdk的安装包,(注意:rpm命令符没有时记得下载一个输入:ap ...
- Loj#2769-「ROI 2017 Day 1」前往大都会【最短路树,斜率优化】
正题 题目链接:https://loj.ac/p/2769 题目大意 给出\(n\)个点\(m\)条地铁线路,每条线路是一条路径. 求\(1\)到\(n\)的最短路且在最短路径的情况下相邻换乘点的距离 ...
- Phalcon如何创建多模块并能进行访问 《Phalcon入坑指南系列 四》
本系列目录 一.Phalcon在Windows上安装 <Phalcon入坑指南系列 一> 二.Phalcon入坑必须知道的功能<Phalcon入坑指南系列 二> 三.Phalc ...
- 做毕设的tricks
CNKI上无法下载博硕士学位论文的PDF版本,只有CAJ版本,挺恶心的.直接下载安装Chrome extension就可以解决了. 链接:https://share.weiyun.com/5HGFF2 ...
- gcc、g++、gdb安装
Windows安装 有闲工夫在Windows上安装g++/gcc/gdb,还不如装个虚拟机安装Linux,在Linux上安装 但是我还是要讲的 首先,需要安装MinGW,MinGW,是Minimali ...
- harmony OS 开发工具安装
harmony OS 开发工具安装 安装流程 安装完成 初始配置 双击打开 Running DevEco Studio requires the npm configuration informati ...
- 题解 [HNOI2012]集合选数
题目传送门 题目大意 直接看题面吧. 思路 感觉挺水的一道题啊?怎么评到紫色的啊?考试的时候LJS出了这个题的加强版我就只想出这个思路,然后就爆了... 不难发现,我们可以构造矩阵: x 2x 4x ...
- dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...