首页 > 其他分享 >P8431 题解

P8431 题解

时间:2022-08-26 02:11:58浏览次数:87  
标签:10 int 题解 LL len P8431 ans

前言

题目传送门!

更好的阅读体验?

这题题解都写得特别复杂,蒟蒻看不懂。因此,我补一篇简单的贪心题解。

思路

题目等同于求最小的 \(p\) 使得 \(f(p)>n\),则 \((p-1)\) 就是答案。

若 \(f(p) > n\),首先要保证 \(p\) 的位数大于等于 \(n\) 的位数。根据贪心思想,我们让末尾不存在 \(0\)。

保证了 \(p\) 的末尾数不为 \(0\),可以得到:\(f(f(p)) = p\)。

因此,我们可以贪心地枚举 \(f(p)\)。我们枚举 \(1 \le i \le len(p)\),其中 \(len(p)\) 表示 \(p\) 的位数。

如何构造 \(g = f(p)\) 呢?步骤如下。

  • 对于每个 \(i\),让第 \(i\) 位的数加一,自然进位。
  • 第 \([i+1, len(p)-1]\) 位均变为 \(0\)。
  • 第 \(len(p)\) 位变为 \(1\),因为末尾不可以是 \(0\)。

显而易见,这样构造出的数 \(g\) 必定大于 \(n\),并且反转后相对来说比较小,因为反转后靠近首位的 \(0\) 较多。

因此,我们直接取 \((\min\limits_{i=1}^{len(n)}{g} - 1)\) 就是答案了。

听起来有些晦涩难懂,代码实现实际比较简单。

总时间复杂度 \(O\Big(T \times len(n)\Big)\)。

代码实现

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
int LEN(LL n) //计算 n 的位数。 
{
	int cnt = 0;
	while (n) cnt++, n /= 10;
	return cnt;	
}
LL f(LL n) //如题的 f(x) 函数。 
{
	LL ans = 0;
	while (n) ans = ans * 10 + (n % 10), n /= 10;
	return ans;
}
void solve()
{
	LL n, minn = 9e18;
	scanf("%lld", &n);
	int len = LEN(n);
	for (int i = 0; i <= len; i++)
	{
		LL p = pow(10, (LL)i); //第 i 位加一。 
		LL ni = n - (n % p) + p; //后面的位全部变成 0。 
		if (ni % 10 == 0) ni++;  // 最后一位变成 1。 
		minn = min(minn, f(ni));
		//printf("ni = %lld;\n", f(ni));
	}
	printf("%lld\n", minn - 1);
}
int main()
{
    int T;
    scanf("%d", &T);
    while (T--) solve();
    return 0;
}

希望能帮助到大家!
首发:2022-07-11 10:51:29

标签:10,int,题解,LL,len,P8431,ans
From: https://www.cnblogs.com/liangbowen/p/16622897.html

相关文章

  • P7535 题解
    前言题目传送门!更好的阅读体验?比赛时考到了这一题,于是写一篇题解纪念一下。思路设\(dp_{i,j}\)表示前\(i\)张钞票分给两人,两人差尽可能接近\(j\)的情况下,获得......
  • CF1066C 题解
    前言题目传送门!更好的阅读体验?本题是简单的双端队列练手题。思路题意大致如下:执行双端队列push_front()操作。执行双端队列push_back()操作。查询\(\min\{m......
  • SP733 题解
    前言题目传送门!更好的阅读体验?校内比赛题。赶紧补篇题解。思路经典的二分加搜索。由于\(h_{i,j}\)范围很小,考虑二分答案。二分答案的范围应该是\([0,110]\)。......
  • P3057 题解
    ###前言题目传送门\(\color{red}{see}\space\color{green}{in}\space\color{blue}{my}\space\color{purple}{blog}\)在学校比赛时遇到了这一题,写一篇题解纪念一下。......
  • P4944 题解
    前言题目传送门!或许更好的阅读体验?这题算是一道中模拟?码量不会很高,大概只有\(100\)至\(150\)行。思路输入地图。注意,还不能读入蛇的行动指令,因为我们不知道......
  • gdfzoj 比赛题解
    前言本次比赛:初一训练5.21/编号531题目难度中等偏上,有几题比较简单,有两三题较难。T1题目:gdfzoj1441思路:算是一道暴力题。由于\(h_{i,j}\)范围很小,考虑二分答......
  • P8344 题解
    ###前言题目传送门\(\color{red}{see}\space\color{green}{in}\space\color{blue}{my}\space\color{purple}{blog}\)这题作为本次比赛的T1,难度感觉还行,算是一道结......
  • AT2580 题解
    前言题目传送门!更好的阅读体验?这题是常规的二分答案。前置知识:二分答案教大家一个小技巧:如何判断一题是否可以使用二分答案,以及如何编写程序?设计\(f(x)\)函数,确......
  • P8400 题解
    前言题目传送门!或许更好的阅读体验?这题非常简单,考察读入读出,以及较简单的代数运算。思路我们可以利用代数解这道题目。设一共有\(n\)个大盒子,\(m\)个小盒子。得......
  • P1415 题解
    前言题目传送门!更好的阅读体验?这题是一道挺好的\(\texttt{dp}\)题啊,但大家的题解都写得不够详细。所以,我来补一篇\(\LaTeX\)题解,希望能帮助大家。思路首先是读......