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代码整合
随机推荐
- CodeForce-811B Vladik and Complicated Book(水题)
http://codeforces.com/problemset/problem/811/B 题意: 给定一个长度为 N 不重复的数字序列,然后对其进行 M 次询问. 每次询问含L,R,X三个值,问如 ...
- PHP中的文件系统函数(一)
从这篇文章开始,我们将学习一系列的 PHP 文件系统相关函数.其实这些函数中,有很多都是我们经常用到的,大家并不需要刻意地去记住它们,只要知道有这么个东西,在使用的时候记得来查文档就可以了. 文件路径 ...
- java中避免集合死链调用
目录 1. 前言 2. 场景 3. 环境 3.1 开发环境准备 3.2 数据准备 3.2.1 Mysql数据库表及数据 3.2.2 redis库数据 4. 解决方式 5.完整代码 5.1Model 5 ...
- SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践
一. 前言 日志对于一个程序的重要程度不用过多的言语修饰,本篇将以实战的方式讲述开源微服务全栈项目 有来商城 是如何整合当下主流日志解决方案 ELK +Filebeat . 话不多说,先看实现的效果图 ...
- windows 根据 端口号 找到进程ID PID
List process by port number netstat -ano | findstr 8080 Proto Local Address Foreign Address State PI ...
- P3180-[HAOI2016]地图【圆方树,莫队,分块】
正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 \(n\)个点\(m\)条边的一个仙人掌,有点权. \(Q\)次询问给出\(op,x,y\),封 ...
- JuiceFS v0.17 发布,通过 1270 项 LTP 测试!
小伙伴们大家好,JuiceFS v0.17 在国庆小长假来临之际如期发布了!这是我们在 2021 年秋季推出的第二个版本,让我们直奔主题,看看都有哪些新变化吧. 本次更新累计 80+ 提交,共有 9 ...
- mysql8 主从搭建
主:192.168.10.2 从:192.168.10.3 主:1.登录mysql,授权账号,让从数据库可以进行复制. mysql CREATE USER 'repl'@'192.168.10.3' ...
- B站1024程序员节部分答案
1.页面的背后是什么? 直接撸页面源码就行啦 2.真正的秘密只有特殊的设备才能看到 修改UA为页面上提示的"bilibili Security Browser" 3.密码是啥? 弱 ...
- VS2017离线安装QT插件出错:未能正确加载VSIX包
问题现象: 问题已解决,忘记截图了 出现原因:可能是自己离线安装,安装版本与不符合当前VS吧.记得当时下载了一个最新的版本.重新卸载当前插件,再装一个合适版本即可 http://download.qt ...