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代码整合
随机推荐
- Android——菜单(Menu)
菜单的运用在Android中很常见,今天就两节体育课,闲下来也想认真的学一学,正好项目中也会有应用.我是跟着菜鸟教程进行学习的,我相应的粘了一些我自己认为比较重要的,以供方便记录学习. 本章给大家带来 ...
- PHP脚本设置及获取进程名
今天来学习的是两个非常简单的函数,一个可以用来设置我们执行脚本时运行的进程名.而另一个就是简单的获取当前运行的进程名.这两个函数对于大量的脚本运行代码有很大的作用,比如我们需要 kill 掉某个进程时 ...
- DEDECMS首页循环调用一级栏目和二级栏目的实现方法
调用方法: {dede:channelartlist typeid='2'} <li class="First"><a href="{dede:fiel ...
- postgres 基础SQL语句 增删改
查看已创建的数据库:select datname from pg_database; 查看所有数据库的详细信息:select * from pg_database 创建数据库:create datab ...
- requests接口测试-requests的安装
requests接口测试-requests的安装 安装常见问题 提示连接不上,443问题 一般是因为浏览器设置了代理,关闭代理. 网络加载慢,设置国内镜像地址 1.pip安装 2.pycharm安装 ...
- php 扫描url死链接
* 从Packagist上搜索需要的包 https://packagist.org/ * 通过composer下载依赖包 composer require guzzlehttp/guzzle comp ...
- Python编码规范(养成好的编码习惯很重要)
学习过程养成良好的编码习惯 1. 类名采用驼峰命名法,即类名的每个首字母都大写,如:class HelloWord,类名不使用下划线 2. 函数名只使用小写字母和下划线 3.定义类后面包含一个文档字符 ...
- 05-IdentityServer4
前面我们认识了jwt的token颁发模式,其中的应用场景和部分缺陷已经很是了解了.有些场合并不适合jwt,特别是针对第三方进行使用时,比如我们使用qq或者微信登陆博客园或其他第三方应用时. Ids4的 ...
- 简易集成websocket技术实现消息推送
Websocket 简介 首先介绍下WebSocket,它是一种网络通信技术,该技术最大的特点就是,服务器端可以主动往客户端发送消息:当然,客户端也可以主动往服务器发送消息,实现两端的消息通信,属于网 ...
- feign的一个注解居然隐藏这么多知识!
引言 最近由于业务的需要,需要接入下阿里云的一个接口,打开文档看了看这个接口看下来还是比简单的目测个把小时就可以搞定,但是接入的过程还是比较坎坷的.首先我看了看他给的示例,首先把阿里云文档推荐的dem ...