HDOJ2089不要62笔记加一些关于疑问(已解决)

本文探讨了在算法竞赛中,针对特定条件筛选的优化策略——打表法,对比直接判断方法,发现打表能显著提高处理多组输入数据时的效率。文章通过两个AC代码实例,详细解释了如何利用预处理(打表)来避免重复计算,从而避免Time Limit Exceeded(TE)问题。

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

题目地址
疑问
关于打表的疑问,如果我不打表,而是直接判断,会TE,如果打表了,则AC,
问题是我打表和直接判断采用的算法都是一样的,换言之我打表至少需要算1000000个数(0-999999),直接算的话至多也就是算1000000个数。
(疑问的解答):想通了,输入不止一组数据,所以打表只需要算一次,不打表就要输入一组数据算一次,所以会TE。
两份打表AC代码
通过sum数组直接相减,但是需要判断临界点,因为减得时候没包括n这个数也减去了

#include <cstdio>
int sum[1000005] = {0};
bool is_four(int n) {
	while(n != 0) {
		int t = n % 10;
		if(t == 4) return true;
		n /= 10;
	}
	return false;
}
bool is_sixXtwo(int n) {
	while(n != 0) {
		int t = n % 100;
		if(t == 62) return true;
		n /= 10;
	}
	return false;
}
int main() {
	sum[0] = 1;
	for(int i = 1; i < 1000005; i++) {
		if(!is_four(i) && !is_sixXtwo(i)) {
			sum[i] = sum[i - 1] + 1;
			//printf("%d\n", sum[i]);
			continue;
		}
		sum[i] = sum[i - 1];
	}
	int n, m;
	while(scanf("%d %d", &n, &m) != EOF && (n || m)) {
		if(!is_four(n) && !is_sixXtwo(n)) {
			printf("%d\n", sum[m] - sum[n] + 1);
			continue;
	    }
	    printf("%d\n", sum[m] - sum[n]);
	} 
	return 0; 
}

通过bool数组相加

#include <cstdio>
bool num[1000005] = {0};
bool is_four(int n) {
	while(n != 0) {
		int t = n % 10;
		if(t == 4) return true;
		n /= 10;
	}
	return false;
}
bool is_sixXtwo(int n) {
	while(n != 0) {
		int t = n % 100;
		if(t == 62) return true;
		n /= 10;
	}
	return false;
}
int main() {
	for(int i = 1; i < 1000005 ; i++) {
		if(!is_four(i) && !is_sixXtwo(i)) {
			num[i] = 1;
		}
	}
	int n, m;
	while(scanf("%d %d", &n, &m) != EOF && (n || m)) {
		int sum = 0;
		for(int i = n; i <= m; i++) {
			sum += num[i];
		}
		printf("%d\n", sum);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Greatljc

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值