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代码整合
随机推荐
- TP6生成url
和TP5生成url方式有区别, 在控制器里 需要加上 ->build(), 如 url('index/arc/list')->build(); 如果是多域名还需要指定域名,如不想加域名可以 ...
- 数据库删除discuz 部分数据操作
如何快速清理discuz 3.2 中等待审核的回复数:pre_forum_post_moderate,点击清空 清空回收站的主题帖:DELETE FROM `pre_forum_thread` WHE ...
- JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)
1.装箱和拆箱: 装箱:把基本数据类型转化为对应的引用数据类型的操作: var num = 123 // num var objNum = new Num(123) // object console ...
- Java基础系列(7)- 标识符和关键字
关键字 标识符 Java所有的组成部分都需要名字.类名.变量名.方法名都称为标识符 首字母以字母(A-Z或者a-z),美元符号($),或者下划线(_)开头 首字母之后可以用字母.美元符号.下划线.数字 ...
- 安装VM-TOOLS,解压tar包时提示目录磁盘空间不足
在虚拟机里安装了ubuntu-18.04.4-desktop-amd64,安装VM-TOOLS,解压tar包时提示目录磁盘空间不足. 解决方法一: 打开terminal,输入:sudo apt ins ...
- 腾讯云centos7.5安装jdk1.8
手动解压安装包方法 在user目录下新建java文件夹 cd /usr/ mkdir java 把jdk安装包移动到java目录下 我已经提前下载jdk的tar包 mv jdk-8u251-linux ...
- win10家庭版 不能远程登录 windows 10 mstsc不可用
Windows10家庭版的用户,因为系统中没有组策略编辑器,需要修改注册表来实现. 注册表路径:HKLM\Software\Microsoft\Windows\CurrentVersion\Polic ...
- P3703-[SDOI2017]树点涂色【LCT,线段树】
正题 题目链接:https://www.luogu.com.cn/problem/P3703 题目大意 \(n\)个点的一棵树开始所有点有不同的颜色,\(m\)次操作 将根节点到\(x\)节点的路径上 ...
- Go语言之循环与条件判断
一.for循环 Go 语言中没有 while 循环,只有一个 for 循环 for 变量初始化;条件;变量自增/自减 { 循环体内容 } 1.基本使用 for i := 0; i < 10; i ...
- CefSharp请求资源拦截及自定义处理
CefSharp请求资源拦截及自定义处理 前言 在CefSharp中,我们不仅可以使用Chromium浏览器内核,还可以通过Cef暴露出来的各种Handler来实现我们自己的资源请求处理. 什么是资源 ...