NOIP2016 D2T2 蚯蚓
其实是一道不是很难的模拟题,暴力好像可以拿80,AC的话要发现其中隐含的单调性
首先是一个小技巧,每次将所有蚯蚓的长度都+q肯定时间复杂度很大,那我们就想,其他所有的蚯蚓加,就相当于取出的蚯蚓减,再存储一下这是第几秒,输出或切蚯蚓的时候将存储的值加上秒数*q即可
然后就是题目中的单调性。对于两只蚯蚓x1,x2,设x1>x2且两者被切时间相差t,由题意显然x1比x2先被切。
那么我们可以列式算出x1和x2切出的蚯蚓到x2被切完那一秒的长度
x1切成的蚯蚓:[px1]+tq,x1-[px1]+tq(取整符号打不出来用方括号[]代替)
x2切成的蚯蚓:[p(x2+tq)]=[px2+ptq],x2-[p(x2+tq)]=x2-[px2+ptq]
tq>ptq且x1>x2,所以[px1]+tq>[p(x2+tq)]。证后半部分时可先去掉取整符号看,上面是(1-p)x1+tq,下面是(1-p)x2-ptq,因为x1>x2,tq>-ptq,所以上面显然大于下面,加上取整后误差不大于1,所以x1-[px1]+tq>x2-[p(x1+tq)]
这样我们就证明了先被切的蚯蚓切成的蚯蚓长度一定大于后被切的蚯蚓切成的蚯蚓长度(按顺序)
然后我们就可以用三个数组来存放,第一个数组表示原蚯蚓,从大到小排序一遍即可,然后每次切的蚯蚓放在第二个数组和第三个数组,这样每个数组都一定是从大到小的,每次取最大的切就可以了(其实就相当于手写优先队列,只不过插入的元素是有序的而已)
最后再把三个数组中的剩余元素放在一起排序一下即可(不要用STL优先队列!会超时!)
贴个代码:
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
using namespace std;
int chong[][],left[]={,,},right[];//存储三堆蚯蚓及它们的左右位置
int ans[],tot;//存放答案并排序的数组
inline int front(int x)//取第x堆的队首元素
{
if(left[x]>right[x])
return INT_MIN;
else
return chong[x][left[x]];
}
bool comp(int a,int b)
{
return a>b;
}
int main()
{
int n,m,q,u,v,t,base=;//base是当前已进行的累加和
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
right[]=n;
for(int i=;i<=n;i++)
scanf("%d",&chong[][i]);
sort(chong[]+,chong[]++n,comp);
for(int i=;i<=m;i++)
{
int flag=;//标记哪一堆的蚯蚓最大
int a=front(),b=front(),c=front();
if(c>=b&&c>=a)
flag=;
else if(b>=a&&b>=c)
flag=;
a=chong[flag][left[flag]]+base;//最大蚯蚓实际长度
b=(int)((long long)u*a/(double)v);
c=a-b;
b-=base+q,c-=base+q;//其他的加相当于取出的减
left[flag]++;//取蚯蚓
chong[][++right[]]=b;//放蚯蚓
chong[][++right[]]=c;
if(i%t==)//被t整除时输出长度
printf("%d ",a);
base+=q;//每次加q
}
printf("\n");
for(int i=;i<;i++)//将剩下的蚯蚓排列
for(int j=left[i];j<=right[i];j++)
ans[++tot]=chong[i][j];
sort(ans+,ans++tot,comp);
for(int i=;i<=tot;i++)
if(i%t==)
printf("%d ",ans[i]+base);
printf("\n");
return ;
}
两个注意事项:
1、要做长度标记(每个时刻蚯蚓伸长的总长度,切和输出时都要加上!)
2、判断三者大小关系时一定要用大于等于!且注意关系,比如c最大是c>=a&&c>=b而不是c>=b&&b>=a(第一次就因为这个WA成35分)
3、找三个队列中最大元素不能不判断队列是否为空,因为前面我们用减代替加,会有负数,初始化的元素为0会让我们取到,所以我直接写了一个取队首元素函数,当队列为空的时候就返回负无穷大
NOIP2016 D2T2 蚯蚓的更多相关文章
- NOIP 2016 D2T2 蚯蚓](思维)
NOIP 2016 D2T2 蚯蚓 题目大意 本题中,我们将用符号 \(\lfloor c \rfloor⌊c⌋\) 表示对 \(c\) 向下取整,例如:\(\lfloor 3.0 \rfloor = ...
- UOJ264 【NOIP2016】蚯蚓
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 【NOIP2016】蚯蚓(队列,单调性)
题目不再重复叙述 请参考: 洛谷 CJOJ 题解 先来说说非完美解法,也是我去年考场上的做法 考虑一下每一只蚯蚓增加的长度, 这个值并不需要每一次依次增加, 用一个变量维护即可,每次取出蚯蚓就加上这个 ...
- 【NOIP2016】蚯蚓(单调队列)
题意: 思路: 我们发现,对于任意两次切割i和j,i<j,在进行完第j次切割后,第i次切割的u/v部分一定大于等于第j次切割的u/v部分,第i次的1-u/v部分也一定大于等于第j次的1-u/v部 ...
- 【NOIP2016】蚯蚓
Description 本题中,我们将用符号 ⌊c⌋表示对 cc 向下取整,例如:⌊3.0⌋=⌊3.1⌋=⌊3.9⌋=3. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀 ...
- $Noip2016/Luogu2827$蚯蚓
$Luogu$ $Sol$ 乍一看就是个模拟叭,用个优先队列维护不就好了.不过这里有一个问题就是怎么解决没被切的蚯蚓的增长问题.可以这样处理,每次切一条蚯蚓,给切完之后的都减去$q$,最后输出答案时都 ...
- 「NOIP2016」蚯蚓
传送门 Luogu 解题思路 很容易想到用一个堆去维护,但是复杂度是 \(O((n+m)\log(n+m))\) 的,显然过不了 \(7e6\). 其实这题有一个性质: 先被切开的蚯蚓,得到的两条新蚯 ...
- LOJ2362. 「NOIP2016」蚯蚓【单调队列】
LINK 思路 良心来说这题还挺思维的 我没看题解也不知道要这样维护 把每次斩断的点分别放进两个队列里面 因为要维护增长,所以可以让新进队的节点来一个负增长? 是不是就好了? 然后很容易发现因为在原始 ...
- 【noip2016】蚯蚓(单调性+队列)
题目贼长 大意是你有n个线段,每一秒你要拿出来最长的一个线段切成两段长度为[p*u](向下取整)和u-[p*u]两段(其中u是线段长,p是一个大于0小于1的实数)没被切的线段长度加q(0<q&l ...
随机推荐
- 【1】mongoDB 的安装及启动
MongoDB是一个面向文档(document-oriented)的数据库,不是关系型数据库.与关系型数据库相比,面向文档的数据库没有"行"的概念,取而代之的是"文档&q ...
- C# Console.WriteLine堵塞进程
最近在项目中控制台为了调试使用Console.WriteLine(),发现在高并发的情况下会出现假锁状态,断点调试发现卡在Console.WriteLine那.需要进行一个键盘输入才可以继续. 关于C ...
- 001-Django简介与项目创建
简介 django,是用python语言写的开源web开发框架,并遵循MVC设计 主要目的是简便.快速的开发数据库驱动的网站 强调代码复用,有很多第三方插件,强调快速开发和DRY(DoNotRepea ...
- Jmeter 后置处理器--jp@gc - JSON/YAML Path Extractor & JSON Extractor
后置处理器--jp@gc - JSON/YAML Path Extractor 1.需要下载插件,地址: 解压后把对应jar包放置对应的lib和lib/ext目录下,重启Jmeter: 2.在需要提取 ...
- ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES)
# Bug描述 今天周末,在家里学点新技术,虽然公司分配的任务没有完成(滑稽滑稽) 我先创建了一个mysql数据库,用root用户创建一个新用户,毕竟项目中使用root是非常危险的,尤其是我这样的实 ...
- 社工 - By源码托管平台|云盘 - GitHub - 汇总
搜索规则 ()默认搜索是从master分支搜索代码 ()只有小于384k的代码才是可以搜索到的 ()搜索语句不能有特殊字符如. , : ; / \ ` ' " = * ! ? # $ &am ...
- 【Qt开发】Qt让线程休息一段时间
Qt 为何没有提供 Sleep 论坛上不时见到有人问: Qt 为什么没有提供跨平台的 sleep 函数? 使用平台相关的 Sleep 或 nanosleep 以后,界面为什么没有反应? QThread ...
- echars 柱状图正常状态 --》二次封装
<template> <!-- 柱状图 正常 1. 调用页面引入 import EcharsColumnNormal from '@/components/echarsColumnN ...
- RocketMQ高可用集群
集群支持: RocketMQ天生对集群的支持非常友好 单Master: 优点:除了配置简单没什么优点 缺点:不可靠,该机器重启或宕机,将导致整个服务不可用 多Master: 优点:配置简单,性能最高 ...
- Qfile
打开方式: void AddStudents::write_to_file(QString src){ QFile file("stu.txt"); if (!file.open( ...