NOIP2016蚯蚓

2024-02-05 10:58
文章标签 蚯蚓 noip2016

本文主要是介绍NOIP2016蚯蚓,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

蚯蚓

NOIP2016提高组Day2 T2

绪言

这个题可以用模拟,可以拿到不少的分数(35分),然后现在我能拿到65分,所以先把65分解法拿出来讲讲方法。

结果

先上一下自己代码的结果
这里写图片描述
把时间限制改大些:
这里写图片描述
大概就是这样。。。

思路

首先需要知道一件事情。
先切割的长度一定比后切割的长度长。
后切割的一定比先切割的短。
然后就可以把这些数据分为三个部分,这里我(蒟蒻的)用了队列:
a原蚯蚓
b切后的蚯蚓1
c切后的蚯蚓2
原蚯蚓先排序(由大到小),这样每次取队首元素就可以保证其可能为最大长度,切后就可以将切后的两只蚯蚓分类(分为p和1-p两种)放入b,c中。
它的特点就是FIFO(first in first out),借助其特点可以如下进行:
选择要切的蚯蚓时,只需要比较a,b,c三个队列的队首元素,找出最大的数max,切掉后把切后的两个部分分别push到b,c队列末端,最后pop掉这个max所在队列的队首元素(即删除max)。
还要注意,当我们使用p这个变量时,尽量不要提前算出来,要用u/v,这样算出来更准确。
这里还需要有一个每个单位时间加长度的部分,我们如果每次都用O(N)去加长度,那会用掉时间:
这里写图片描述
这样时间太长了,显然不行。
提出这样一个方法:
设置一个变量len,len表示已经积累的长度。初始化len=0,每回合结束时len+=q,当然在结束前,我们还要考虑这一时刻被切掉的蚯蚓,首先要将最长的蚯蚓标示长度max加上len,也就是说(len+max)是要被切的蚯蚓的长度,这时候如果ti≡0(mod t)【Postscript:就是ti是t的正倍数】就可以输出,然后按照上文所讲的方法push,pop,这里注意push时把被切蚯蚓长度(len+max)*u/v之后还要把它还原回下一局没加过len的情况,即
push(floor((maxx+len)*u/v)-len-q)
与另外一个,不难写出,请读者自己解决(或看下述代码)。
然后输出一个空行。
最后m个回合结束后,要把三个集合都pop出来,存到一个qy[]数组,这样就可以sort排序从大到小排出来,按题意输出即可。

代码

(C++)
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
int i,j,m,n,q,u,v,t;
long long maxx,ma;
long long len;
int qy[71000001];
int r()
{int ans=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9'){ans*=10;ans+=ch-'0';ch=getchar();}return ans;
}bool cmp(int x,int y)
{return (x>y);
}int main()
{freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);queue<int> a,b,c;n=r();m=r();q=r();u=r();v=r();t=r();for(i=1;i<=n;i++)qy[i]=r();sort(qy+1,qy+n+1,cmp);for(i=1;i<=n;i++)a.push(qy[i]);int ti=0;while(ti<m){maxx=-1000000000;ti++;if(maxx<a.front()) maxx=a.front(),ma=1;if(maxx<b.front()) maxx=b.front(),ma=2;if(maxx<c.front()) maxx=c.front(),ma=3;if(ma==1){b.push(floor((maxx+len)*u/v)-len-q);c.push((maxx+len)-floor((maxx+len)*u/v)-len-q);a.pop();}if(ma==2){b.push(floor((maxx+len)*u/v)-len-q);c.push((maxx+len)-floor((maxx+len)*u/v)-len-q);b.pop();}if(ma==3){b.push(floor((maxx+len)*u/v)-len-q);c.push((maxx+len)-floor((maxx+len)*u/v)-len-q);c.pop();}if(ti%t==0)cout<<maxx+len<<" ";len+=q;n++;}cout<<endl;i=1;while(!a.empty()){qy[i]=a.front()+len;i++;a.pop();}while(!b.empty()){qy[i]=b.front()+len;i++;b.pop();}while(!c.empty()){qy[i]=c.front()+len;i++;c.pop();}sort(qy+1,qy+n+m+1,cmp);for(i=1;i<=n;i++)if(i%t==0)cout<<qy[i]<<" ";cout<<endl;}

结束语

这个题用到了queue,当然还有dalao用了堆(效果更好)。对此表示我对堆这个东西还不大熟悉,革命尚未成功,同志仍需努力。

这篇关于NOIP2016蚯蚓的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680691

相关文章

[noip2016]天天爱跑步

题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做《天天爱跑步》的游戏。《天天爱跑步》是一个养成类游戏,需要玩家每天按时上线,完成打卡任务。 这个游戏的地图可以看作一一棵包含 n个结点和 n-1条边的树, 每条边连接两个结点,且任意两个结点存在一条路径互相可达。树上结点编号为从1到n的连续正整数。 现在有m个玩家,第ii个玩家的起点为 ,终点为 。每天打卡任务开始时,所有玩家在第0秒同

信息学奥赛初赛天天练-71-NOIP2016普及组-基础题2-进制转换、二进制转八进制、八进制转二进制、二叉树数组存储、寻址空间

NOIP 2016 普及组 基础题2 4 以下不是 CPU 生产厂商的是( ) A Intel B AMD C Microsoft D IBM 8 与二进制小数 0.1相等的八进制数是( ) A 0.8 B 0.4 C 0.2 D 0.1 9 以下是 32 位机器和 64 位机器的区别是( ) A 显示器不同 B 硬盘大小不同 C 寻址空间不同 D 输入法不同 11一棵二叉树如右图所示,若

信息学奥赛初赛天天练-70-NOIP2016普及组-基础题1-二进制、二进制状态表示、二进制加法、字符、字符数组、字符串、空串

NOIP 2016 普及组 基础题1 1 以下不是微软公司出品的软件是( ) A Powerpoint B Word C Excel D Acrobat Reader 2 如果 256 种颜色用二进制编码来表示,至少需要( ) 位 A 6 B 7 C 8 D 9 3 以下不属于无线通信技术的是( ) A 蓝牙 B Wifi C GPRS D 以太网 7 二进制数 00101100 和 0

【NOIP2016提高A组模拟9.24】就是乘法

Description 这一天富爷又来找大头玩乘法游戏,然而不同于富爷的口算能力,大头只能列下了式子。第一题是432 × 5678: 432 5678 ------- 3456 3024 2592 2160 ------- 2452896 作为环保主义者的大头,认为最后一行的答案一定不能有任何的前导空格,当然了,对于某些行来说前导空格不能省。但是,珍惜资源的大头,认为任何一行

【NOIP2016提高A组模拟9.17】小a的强迫症

Description Input 第一行n 第二行n个数,代表每种颜色的数量 Output 答案 Sample Input 3 2 2 1 Sample Output 3 Data Constraint n<=100000 n<=100000 Solution 假设当前做到第i种颜色,数量为a,第1到第i-1种颜色的数量和为s 那么当前已经有s个球了,为了保证

【NOIP2016提高A组模拟9.15】Map

Description Input Output 所有询问的和 Sample Input 4 4 2 1 2 2 3 3 2 3 4 1 2 1 4 Sample Output 14 样例解释: upd:保证原图连通。 “不相交路径”的定义为不存在相同的边。可以存在相同的点。重边视为不同的边。 对于样例: 原图有2个安全点对为(2,3),(3,2) 询

【NOIP2016提高A组模拟9.15】Osu

Description 有n个点,每个点有出现的时间ti和位置(xi,yi),点到一个就得分,问在得K分的情况下的最小鼠标移动速度 Sample Input 4 2 1 2 2 2 0 2 3 0 0 4 2 0 Sample Output 1 2 1 样例解释: 圆圈只在出现的时刻有效。即:时刻t_i时鼠标位置恰好在(x_i,y_i)才能得分。 Kaguya所做的工作就是

【NOIP2016提高A组模拟9.15】Math

Description Sample Input 3 5 Sample Output -1 Data Constraint n<107 n<10^7 m<1014 m<10^{14} Solution 发现如果答案减一,那肯定是i*j是完全平方数 O(n)枚举i,O(1)求出i*j为完全平方数的个数就行了 线性求用线筛 #include<cstdio>#inclu

【NOIP2016提高A组模拟9.9】爬山

Description 国家一级爬山运动员h10今天获得了一张有着密密麻麻标记的地图,在好奇心的驱使下,他又踏上了去爬山的路。 对于爬山,h10有一个原则,那就是不走回头路,于是他把地图上的所有边都标记成了有向边。他决定从点S出发,每到达一个新的节点他就可以获得一定的成就值。同时h10又是一个很珍惜时间的运动员,他不希望这次爬山的成就值白白浪费,所以最后他一定要在一个存档点停下,保存自己的成就

【NOIP2016提高A组模拟9.9】运输妹子

Description 小轩轩是一位非同一般的的大农(lao)场(si)主(ji),他有一大片非同一般的农田,并且坐落在一条公路旁(可以认为是数轴),在他的农田里种的东西也非同一般——不是什么水稻小麦,而是妹子。 在小轩轩的细心培育下,他的大片农田都要结出妹子啦!但是他的农田分布实在是太广阔了,他担心自己的妹子会令路过的人想入非非,于是他想要把所有农田上的妹子都集中到一个仓库里面,贮存起来。可