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代码整合
随机推荐
- 机器学习——最优化问题:拉格朗日乘子法、KKT条件以及对偶问题
1 前言 拉格朗日乘子法(Lagrange Multiplier) 和 KKT(Karush-Kuhn-Tucker) 条件是求解约束优化问题的重要方法,在有等式约束时使用拉格朗日乘子法,在有不等 ...
- ecshop后台设置模板的地方显示自己新建模板的操作界面
我建立了一个叫test.dwt文件怎样在后台设置模板里面出现呢.1首先找到ecshop目录下的languages\zh_cn\admin/template.php 这个php文件 当然如果这只是简体中 ...
- Jvm调优理论篇
Jvm实战调优 OOM(Out Of Memory) 内存溢出错误 ps:由于Java虚拟机有许多实现,本文主要阐述的是OpenJDK的HotSpot虚拟机,JDK版本是8. 一.首先要明白造成OOM ...
- Shell系列(6)- 管道符
多命令顺序执行 多命令执行符 格式 作用 ; 命令1 ; 命令2 连接命令:多个命令顺序执行,命令之间没有任何逻辑联系:前面命令报错,后面命令照常执行 && 命令1 && ...
- genymotion启动模拟器后,sdk查询adb devices为空-解决方案
我们在genymotion中安装了一个安卓模拟器,比如Google Nexus 4,启动该模拟器后,在cmd中输入adb devices,发现为空. 解决方案:在genymotion选择Setting ...
- CF1446F-Line Distance【计算几何,树状数组,二分】
正题 题目链接:https://www.luogu.com.cn/problem/CF1446F 题目大意 给出\(n\)个点,求所有点对构成的直线中与原点距离第\(k\)小的距离 \(2\leq n ...
- Redis之品鉴之旅(一)
Redis之品鉴之旅(一) 好知识就如好酒,需要我们坐下来,静静的慢慢的去品鉴.Redis作为主流nosql数据库,在提升性能的方面是不可或缺的.下面就拿好小板凳,我们慢慢的来一一品鉴. 1)redi ...
- 未能加载文件或程序集“System.Net.Http
前言 简单说先事情的起因吧,之前的程序写了有一段时间了,最近要添加新的功能.顺手就把NuGet包全部更新到最新版.随之问题就出现了. 开始以为是.NET Framework 库的原因,之前是4.6.1 ...
- 三千字介绍Redis主从+哨兵+集群
一.Redis持久化策略 1.RDB 每隔几分钟或者一段时间会将redis内存中的数据全量的写入到一个文件中去. 优点: 因为他是每隔一段时间的全量备份,代表了每个时间段的数据.所以适合做冷备份. R ...
- Android 开发进程 0.35 升级编译版本Android12
Android12升级 工作需要升级到编译版本31 在这里记录一下遇到的问题. 错误:Manifest merger failedManifest merger failed 这个问题通常搜到的答案是 ...