首页 > 其他分享 >[Codeforces] CF1728C Digital Logarithm

[Codeforces] CF1728C Digital Logarithm

时间:2023-11-24 20:47:34浏览次数:35  
标签:Logarithm int ans Codeforces init Maxn Digital 操作 cmp

题目传送门

很奇妙的一道题,我想到了正解,但是又没有完全想到

题意

我们定义 \(f(x)\) 表示取出 \(x\) 在十进制下的位数。( 如 \(f(114514) = 6, \; f(998244353) = 9\) )。形式化讲,就是 \(f(x) = \lfloor \log_{10} x \rfloor + 1\)。

给定两个数组 \(a\) 和 \(b\),求执行若干次以下操作后使得 \(a\) 和 \(b\) 排序后相等的最小操作次数。

操作方法如下:

  • 选择一个下标 \(i\),将 \(a_i\) 赋值为 \(f(a_i)\) 或者将 \(b_i\) 赋值为 \(f(b_i)\)。

思路1

很明显,任何数操作两次,即\(f(f(x))\),一定为\(1\)

所以,可以模拟这两种操作。

首先将两个序列去重,再把每个数都进行一次操作并记录,接着继续去重,然后剩下的就都要被变为1,也就是每个数都要被操作一次

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int Maxn=2e5+10;
int a[Maxn],b[Maxn],n;
int ans;
bool cmp(int x,int y)
{
	return x>y;
}
void init()
{
	bool fa[Maxn]={},fb[Maxn]={};
	int nowa,nowb;
	priority_queue<int> qa,qb;
	nowa=nowb=1;
	sort(a+1,a+n+1,cmp);
	sort(b+1,b+n+1,cmp);
	for(;nowa<=n && nowb<=n;)
	{
		if(a[nowa]==b[nowb]) fa[nowa]=1,fb[nowb]=1,nowa++,nowb++;
		else if(a[nowa]<b[nowb]) nowb++;
		else nowa++;
	}
	for(int i=1;i<=n;i++)
	{
		if(!fa[i]) qa.push(a[i]);
		if(!fb[i]) qb.push(b[i]);
	}
	int now=1;
	while(!qa.empty() && !qb.empty())
	{
		a[now]=qa.top(),b[now]=qb.top();
		now++;
		qa.pop(),qb.pop();
	}
	n=now-1;
}
int f(int x)
{
	int re=0;
	while(x) re++,x/=10;
	return re;
}
void print()
{
	sort(a+1,a+n+1,cmp);
	sort(b+1,b+n+1,cmp);
	cout<<"size="<<n<<endl;
	for(int i=1;i<=n;i++) printf("%2d ",a[i]);cout<<endl;
	for(int i=1;i<=n;i++) printf("%2d ",b[i]);cout<<endl;
} 
int run()
{
	cin>>n;ans=0;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	init();
	if(n==0)
	{
		cout<<0<<endl;
		return 0;
	}
	for(int i=1;i<=n && a[i]>9;i++) ans+=(a[i]!=1),a[i]=f(a[i]);
	for(int i=1;i<=n && b[i]>9;i++) ans+=(b[i]!=1),b[i]=f(b[i]);
//	print();
	init();
//	print();
	for(int i=1;i<=n;i++) ans+=(a[i]!=1),a[i]=f(a[i]);
	for(int i=1;i<=n;i++) ans+=(b[i]!=1),b[i]=f(b[i]);
	init();
//	print();
	cout<<ans<<endl;
}
int main()
{
	int t;
	cin>>t;
	while(t--) run();
}

其中,init是去重,就是把两个数组排序,并使用两个坐标记录两个序列的位置,那个较小那个向后移动,直到相等或变得比另一个更大。如果两个相等,那么就标记并删除

思路2

这是老师的思路,我没有写这个代码,但是明显这个思路比我的要简单的多

用两个优先队列存储两个序列,每次比较对头(即最大值),如果相等那么扔掉,否则操作较大的并添加到队尾,以此类推,直到序列为空

可以找时间谢谢这个代码,会比我的简单很多

标签:Logarithm,int,ans,Codeforces,init,Maxn,Digital,操作,cmp
From: https://www.cnblogs.com/lyk2010/p/17854723.html

相关文章

  • [Codeforces] CF1475C Ball in Berland
    BallinBerland-洛谷题意在毕业典礼上,有\(a\)个男孩和\(b\)个女孩准备跳舞,不是所有的男孩和女孩都准备结伴跳舞。现在你知道\(k\)个可能的舞伴,你需要选择其中的两对,以便使没有人重复地出现在舞伴里,求可能的数量。思路暴力最朴素,也是简单的方法,就是通过暴力组合进行配对。......
  • [Codeforces] CF1506C Epic Transformation
    EpicTransformation-洛谷算是今天的题目里边思维难度最高的一道了,但是代码真的简单的要死题意你有一个长度为 \(n\) 的序列 \(a\),你可以对其进行下列操作:选择 \(i,j\) 满足 \(*a_i\neqa_j*\) 然后删除 \(*a_i,a_j*\) 两个数。求序列 a 经过若干次操作后最少......
  • [Codeforces] CF1705C Mark and His Unfinished Essay
    题目传送门题意给定长度为\(n\)的字符串\(s\),进行\(c\)次操作,每次操作将\(s_l\)到\(s_r\)复制到字符串尾。全部操作结束后有\(q\)次询问,每次询问字符串\(s\)的第\(k\)位。数据保证\(r\)不超过当前字符串长度,\(k\)不超过最终字符串长度。思路及分析通过数......
  • [Codeforces] CF1858C Yet Another Permutation Problem
    YetAnotherPermutationProblem-洛谷这题本来很简单,思路我也想到了,但是代码一直没写对,思路也一直换来换去(悲然而发现最开始的思路是对的题意Alex收到了一个名为"GCD排列"的游戏作为生日礼物。这个游戏的每一轮进行如下操作:首先,Alex选择一个整数序列\(a_1,a_2,…,a_......
  • Codeforces Round 905 (Div. 3)
    CodeforcesRound905(Div.3)A.Morning题意:操作:显示,向前走都为一次操作;目标:显示这四个数思路:0->10,然后依次作差就行#include<bits/stdc++.h>usingnamespacestd;voidsolve(){chara[4];intmi=100,sum=4,b[4];for(inti=0;i<4;i++){cin>>a[i]......
  • Codeforces Round 903 (Div. 3)
    CodeforcesRound903(Div.3)A.Don'tTrytoCount大概题意给你两个字符串a,b。a串可进行的操作为将整个a串复制到之前的a串后面(直接用a+a即可),然后看操作多少次可以让b串变为a串的子串如果不能就输出-1。#include<iostream>usingnamespacestd;stringa,b;voidsolve()......
  • Codeforces Round 910 (Div. 2)
    CodeforcesRound910(Div.2)A.MilicaandString解题思路:统计给定字符串\(s\)中的\(B\)的数量,记录为\(cnt\)。如果\(cnt==k\):输出0;如果\(cnt<k\):从左往右数,将第\(cnt-k\)个\(A\)的位置前的数全部变成\(B\).如果\(cnt>k\):从左往右数,将第\(k-cnt\)个\(B\)的......
  • error:0308010C:digital envelope routines::unsupported
    执行:npmrunserve 出现:error:0308010C:digitalenveloperoutines::unsupported原因:npm版本升级解决:package.json增加配置"scripts":{"serve":"setNODE_OPTIONS=--openssl-legacy-provider&&vue-cli-serviceserve","b......
  • CodeForces 1898F Vova Escapes the Matrix
    洛谷传送门CF传送门Type\(1\)是简单的。直接输出空格个数即可。Type\(2\)也是简单的。显然要堵住不在起点和出口最短路上的格子,答案为空格个数减去起点到任一出口的最短路。考虑Type\(3\)。容易发现答案为空格个数减去起点到任两个出口的最短路(公共部分只算一次)。考虑......
  • Codeforces Round 697 (Div. 3)
    A.OddDivisor#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong//#defineint__int128#definedoublelongdoubletypedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<string,string>PSS;constintN=......