卡时

卡时

背景

有的时候,我们的搜索会搜很很很很很久,会TLETLE的分数=0,但是如果你在即将TLE时输出了当前最优解,分数即可0。那么这是就需要卡时。

什么是卡时

卡时,顾名思义,卡时间,就是我们要用一个东西记录当前的时间,如果快要超时了,输出当前最优解,结束。

实现

朴素版(错误

#include<bits/stdc++.h>
//#include<ctime>
//如果你不用bits/stdc++.h那么一定要加ctime

using namespace std;

int st;

signed main(){
	
	st = clock();//记录一下当前的时间的
	
	while(1){//假装在搜索
		if(clock()-st >= 0.95) break;
		//如果现在时间-开始时间要超过1s了,退出
	}
	
	cout << 52520 << endl;//输出当前搜索出的最优解
	
	return 0;
	
}

这时,如果你交到洛谷上,你会惊奇的发现,你的每个测试点都在1ms以内结束了,这是因为洛谷是Linux系统,算时间是单位用的微秒,0.95代表的0.95μs,也就是不到1ms,那么你也不知道你叫的评测机是什么单位的,这时就要统一单位。

朴素版

我们只要一个东西,CLOCK_PEP_SEC,这个用来存当前系统1s内时间单位的个数,它就是1s,再乘个0.95950ms

#include<bits/stdc++.h>

using namespace std;

int st;

signed main(){
	
	st = clock();//记录一下当前的时间的
	
	while(1){//假装在搜索
		if(clock()-st >= 0.95*CLOCK_PEP_SEC) break;
		//如果现在时间-开始时间要超过1s了,退出
		//CLOCK_PEP_SEC是1s时间单位的个数
	}
	
	cout << 52520 << endl;//输出当前搜索出的最优解
	
	return 0;
	
}

优化版

我们又发现这里有一个实数乘法,众所周知……

如果我们说加法的时间是1,那么减法也是1,乘法呢?
100
没有那么多,也就32
除法呢?
100
没有那么多,也就1000吧。

这里虽然是乘法,但是是实数,我们想让它成为整数乘法,怎么弄?两边同乘以1000即可。

#include<bits/stdc++.h>
#include<ctime>

using namespace std;

int st;

signed main(){
	
	st = clock();//记录一下当前的时间的
	
	while(1){//假装在搜索
		if((clock()-st)*1000 >= 950*CLOCK_PEP_SEC) break;
	}
	
	cout << 52520 << endl;//输出当前搜索出的最优解
	
	return 0;
	
}

最终dfs

#include<bits/stdc++.h>
#include<ctime>

using namespace std;

int st;

void dfs(){
	if(clock()-st*1000 >= 950*CLOCK_PEP_SEC){
		cout << 52520 << endl;//输出当前最优解
		exit(0);//退出整个程序,约等于return 0;
	}
	dfs();
}

signed main(){
	
	st = clock();//记录一下当前的时间的
    
    dfs();
	
	return 0;
	
}

卡多久

999吗?不行。首先后面还要输出最优解和退出程序,时间不够的退出。其次,评测机波动会导致时间变化。(比如今天一个同学相同代码第一次交80,第二次交直接100
那就950吧。其实可以,但是CCF重测时时限超过950ms就不给重测了(虽然没有人会去重测,据老师所知,重测没有成功的)。
所以综上所述,大概900就可以了

posted @   不认命,就是哪吒的命!  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示