「NOIP2016」[提高组Day2T2] 蚯蚓earthworm (数组模拟队列)超详细题解

本文是关于NOIP2016提高组Day2T2题目的详细解题,主要探讨如何使用数组模拟队列解决蚯蚓生长和切割的问题。通过两种思路,一是完全模拟但容易导致TLE,二是进行各种优化以实现AC。优化主要包括将多次sort减少到一次,以及简化蚯蚓生长的计算。文章提供了完整的代码实现和优化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言
这里是蒟蒻TIMEpings,这是我第一次真正动手写题解 (虽然之前有想过很多次) ,有误之处请各位大佬多多指出(=・ω・=)!


原题太长了…在本题解内就不贴出原题了,不过看题解的人都应该有原题吧!
题目传送门(LOJ)

思路1-完全模拟(TLE警告)

当蒟蒻走投无路时,这种解法是骗分的好助手

全局变量们

#define MAXN 7100000+7 //n+m的最大值,我把所有的蚯蚓都放里面了
int worm[MAXN];
int n,m,q,u,v,t;
double p;
int now_worm_cnt; //当前蚯蚓计数
int spc; //读秒,第一行的输出所需
int edT; //要求的[输出m秒后第n*t名的蚯蚓长度]的次数

main()

	scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
	p = u*1.0/v; //有理数警告
	now_worm_cnt=n; //现在有n条蚯蚓(废话)
	int ai;
	for(int i=1;i<=n;i++)
	{
   
		scanf("%d",&ai);
		worm[i]=ai;
	}
	edT = (n+m)/t;
	for(int i=1;i<=m;i++)	doworm();
	print_answer();

先输入6个参数,提前把p算出来(这样可能会影响精度,不推荐),向worm里存每个蚯蚓,edT算出来也算是半个暴力优化,在print_answer()里面会体现。
时间复杂度的主要承担者之一doworm()需要循环做m次。

doworm()

“模拟的大框架”

	spc++; //第一行输出记步
	sort(worm+1,worm+1+now_worm_cnt,cmp); //降序自动快排咯
	int topworm = worm[1]; //刀砍出头虫
	if(spc==t) //步输出周期已到
	{
   
		printf("%d ",topworm); //出头虫上榜
		spc=0; //读秒归零
	}
	cut(topworm)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值