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 ...
随机推荐
- 用例a失败,跳过测试用例b和c并标记失败xfail
前言 当用例a失败的时候,如果用例b和用例c都是依赖于第一个用例的结果,那可以直接跳过用例b和c的测试,直接给他标记失败xfail用到的场景,登录是第一个用例,登录之后的操作b是第二个用例,登录之后操 ...
- 使用Postman对HTTP接口进行功能测试
一.工具说明 Postman是一种网页调试与发送网页http请求的工具.我们可以用来很方便的模拟get或者post或者其他方式的请求来调试接口. 二.应用场景 1.Get请求 get请求通过接口参数拼 ...
- RESR API (三)之Views
Class-based Views Django's class-based views are a welcome departure from the old-style views. - Rei ...
- C# Hook 方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- android 程序的运行步骤(备忘)
java代码: public class HelloWorld { public static void main(String[] args) { System.out.println(" ...
- 【MM系列】SAP MM模块-控制采购订单中某些项目的输出显示
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-控制采购订单中某些 ...
- Java基础/Socket.io双向通信
Socket.io基础知识(一) (一).socket.io提供了基于事件的实时双向通讯 Web端与服务端实时数据传输方式: 1.Ajax轮询方式(最早应用) 原理:设置定时器,定时通过Ajax同 ...
- git关联github远程仓库的问题
git关联github远程仓库的时候,报fatal: remote origin already exists. 导致这个问题原因可能是之前关联的时候关联错了,再次关联就不行了. 解决办法是: 1.将 ...
- Bean与Map的转换 和 Map与Bean的转换
package com.JUtils.beanConvert; import java.beans.BeanInfo; import java.beans.IntrospectionException ...
- linux 正则表达式 目录
linux 通配符与正则表达式 linux 通配符 linux 正则表达式 使用grep命令 linux 扩展正则表达式 egrep linux 正则表达式 元字符