首页 > 其他分享 >[暴力题解系列+正经题解]好数

[暴力题解系列+正经题解]好数

时间:2024-04-14 12:44:22浏览次数:33  
标签:10 正经 暴力 int 题解 枚举 好数

好数

虽然不是13号考的那批人,但是还是扔一个暴力题解在这里。

首先数据范围\(n\le 10^7\),就算纯粹暴力去做也只是\(O(nlogn)\),也就是直接从1到n去枚举。秉持着暴力就是要优化细节的精神,对题目进行一个分析,发现无论如何,个位数必须是奇数,否则必然不满足条件,那么优化手段就显而易见了:枚举只枚举奇数。直接把时间复杂度砍一刀成为\(O(\frac{n}{2}log\frac{n}{2})\)。实际优化性能如何呢?在我机子上跑,从\(1\)完全数到\(10^7\)需要0.08秒,而只枚举奇数就能变成0.05秒,要知道对于暴力来说,就算是0.03秒也是一种非常要命的资源。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int n, cnt = 0;
	n = 10000000;
	//scanf("%d", &n);
	for(int i=1; i<=n; i+=2)
	{
		int temp = i;
		int eo = 1, is = 1; // 0为偶数,1为奇数 
		while(temp>0)
		{
			int c = temp % 10;
			temp /= 10;
			if(c%2 != eo)
				is = false;
			if(!is)
				break;
			eo = !eo;
		}
		if(is)
			cnt++;
	}
	printf("%d\n", cnt);
	return 0;
}

至于如果数据范围变大要怎么做呢?我在此之前思考过一个思路:由于每一个位置可用的数字其实是固定的,奇数位只能是13579(5个),偶数位只能是02468(5个),首位数字如果是偶数则只能用2468(4个)。因此可以基于排列组合的计算方式处理掉绝大部分数据。例如查询2024,就可以通过计算\(5+4\times5+5\times5\times5 = 150\)获得前面的数字(即1~999),随后可以通过相似的计算得到1000~2000的数据,然后继续分治得到2000~2020的数据,最终再直接枚举2020~2024的数据,即使面对\(1\le n\le 10^{100}\)也不可能爆时间。(拍胸脯)

但是下面的程序我就不想写了,因为已经写红温了。

标签:10,正经,暴力,int,题解,枚举,好数
From: https://www.cnblogs.com/ComputerEngine/p/18134008

相关文章

  • P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    题目传送门试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能够算出答案。【程序】#include<bits/stdc++.h>usingnamespacestd;intmain(){printf("%d\n",256*8/32*1024*1024);return0;}【答案】67108864......
  • P8679 [蓝桥杯 2019 省 B] 填空问题 题解
    题目传送门试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,找到各号位上有成绩的选手时再进行进一步搜索即可。【程序】#include<bits/stdc++.h>usingnamespacestd;intteam[20][6];intmax_sum;boolvis[20];voiddfs(intu,intsu......
  • P9686 Judg. 题解
    题目传送门一道简单模拟。这道题最简单的方法就是直接在for循环中判断题目给出状态是否为AC,如果不是则输出当前\(i\)的值,否则就不输出。#include<bits/stdc++.h>usingnamespacestd;constintMAXN=1e5+10;intn;stringa[MAXN];intmain(){ scanf("%......
  • P9517 drink 题解
    题目传送门这道题考场上用的查找做的。先用一个结构体分别表示firstlast,然后进行查找即可,两个for循环分别计算出first和last,最后计算它们的差值。(注意,计算差值时要加1)然后你就会发现一个问题:只有\(90\)分。所以我们来思考一下哪里出现了问题。你会发现:如果全都是......
  • P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    题目传送门试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能够算出答案。【程序】#include<bits/stdc++.h>usingnamespacestd;intmain(){printf("%d\n",256*8/32*1024*1024);return0;}【答案】67108864......
  • [题解]P3413 萌数
    P3413萌数先打出暴搜代码,参数有\(pos,limit,hui\),其中bool类型的\(hui\)表示到当前是否有回文。暴搜代码中加入了一个剪枝:if(!limit&&hui)returnpow10[pos];,这个!limit很重要,我就是因为这个没加,暴搜代码都调了半天。然后就是if(pos==0)returnhui;。我们还需要记录下填过的......
  • [题解]CF55D Beautiful Numbers
    CF55DBeautifulNumbers打出暴搜后有些茫然,不知道该怎么优化才好,看了题解才豁然开朗。简单说下暴搜的思路:参数有\(pos,limit,lcm,num\)。其中\(lcm\)表示到\(pos+1\)位,所有非\(0\)位的\(lcm\)是多少;\(num\)表示填到\(pos+1\)位的整个数是多少。然后在\(pos=0\)时判断\(lcm\)是......
  • [题解]CF1073E Zegment Sum
    CF1073ESegmentSum这道数位dp与其他不同的是,这个求的是满足要求的数的和,这种题型的题我们还没有做过。以前虽然做过一些求和或者求积的题,但都是求每个满足条件的数的数位和、二进制1的个数等等的和。而这道题是对\([L,R]\)中满足条件的数直接求和,这意味着基本不会有两个状态得......
  • [NOIP2018] 旅行 题解
    明显要以\(1\)为起点。原图是树这种情况下,走路不能回头,只能用\(dfs\)的思路走。当然肯定每次都走较小的那棵子树,\(vector\)存图后排序即可达到这种效果。时间复杂度\(O(n\logm)\)。原图是基环树明显可以分别考虑将所有边断掉后的情况,取字典序最小的。时间复杂度\(O(......
  • CF382B Number Busters 题解
    总共就两种情况。当\(b\geqx\)时,\(b\)要减\(x\),\(c\)要减去一。当\(b\ltx\)时,\(a\)和\(c\)都要减一,\(b=w-x\)。如果\(c>a\),退出循环。每一次循环判断\(b\)跟\(x\)的关系,然后秒数加一。代码:#include<bits/stdc++.h>usingnamespacestd;inta,b,c,w,x;in......