首页 > 其他分享 >CF1728C Digital Logarithm

CF1728C Digital Logarithm

时间:2023-11-22 21:45:24浏览次数:30  
标签:Logarithm int ans init Maxn Digital 操作 CF1728C

CF1728C Digital Logarithm

题目传送门

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

题意

我们定义 $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,init,Maxn,Digital,操作,CF1728C
From: https://www.cnblogs.com/lyk2010/p/17850360.html

相关文章

  • 6-1891D-Suspicious logarithms
    题意:思路:分块,先对f(x)相同的分块,在对g(x)相同的分块,注意爆longlnog代码:点击查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;typedefpair<int,int>pll;typedeftuple<int,int,int>TP;constintN=1e7+10;intinf=1e9+7;int......
  • error:0308010C:digital envelope routines::unsupported问题解决
    问题描述:报错:Error:error:0308010C:digitalenveloperoutines::unsupported报错原因:因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制报错详细信息:解决方案:方案1:打开IDEA终端,直接输入Linux&MacOS:exportNODE_OPTI......
  • vue前端项目启动报错:error:0308010C:digital envelope routines::unsupported
    问题描述使用 npmrundev 或者 yarnrundev 时报错:error:0308010C:digitalenveloperoutines::unsupported解决方案修改package.json,在相关构建命令之前加入setNODE_OPTIONS=--openssl-legacy-provider"scripts":{"dev":"setNODE_OPTIONS=--openssl-legacy-provide......
  • 若依vue启动报Error: error:0308010C:digital envelope routines::unsupported
    解决:若依vue启动报Error:error:0308010C:digitalenveloperoutines::unsupported1.描述:问题产生原因是因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响.解决方法:有很多种,我把适合我的写在第一......
  • Error: error:0308010C:digital envelope routines::unsupported
    "start":"SETNODE_OPTIONS=--openssl-legacy-provider&&cross-envUMI_ENV=devumidev","start:dev":"SETNODE_OPTIONS=--openssl-legacy-provider&&cross-envREACT_APP_ENV=devMOCK=noneUMI_ENV=devu......
  • CF1866D Digital Wallet 题解
    Problem-1866D-CodeforcesDigitalWallet-洛谷不妨为选数钦定一个顺序:不同行之间无影响,列从左到右取一定不劣。设计状态:设\(dp_{i,j}\)表示前\(i\)次操作操作到第\(j\)列的最大答案转移:因为对于同一列不互相影响,因此枚举这一列取\(c\)个数,显然取这一列数......
  • Signal Filters Design Based on Digital Signal Processing
    ThoeriesI.FourierSeriesExpansionAlgorithmWecanutilizetheFourierSeriestoproducetheanalogsignalwithsomefrequencycomponents.Foranysignal,itsFourierseriesexpansionisdefinedas\[x(t)=\frac{A_0}{2}+\sum_{n=1}^{\infty}A_n\cos......
  • 安信可小安派【Analog to digital】 ADC 基于AI-M6x
    今天来分享一下我的ADC学习心得,首先说明当前的教程适用于所有的搭载AI-m61或者m62芯片的小安派。需要的库文件如库文件说明bflb_adc.hADC功能log.h用来打印日志bflb_gpio.h初始化GPIObflb_mtimer.h延时board.h初始化系统重要的方法如下:/***......
  • 错误解决Error: error:0308010C:digital envelope routines::unsupported
    问题原因:查了下原因,主要是nodeJsV17版本发布了OpenSSL3.0对算法和秘钥大小增加了更为严格的限制,nodeJsv17之前版本没影响,但V17和之后版本会出现这个错误。我的node版本是v18.12.1解决方式(仅windows):在package.json的scripts中新增SETNODE_OPTIONS=--openssl-lega......
  • Webpack报错Error: error:0308010C:digital envelope routines::unsupported处理
    在学习组件库流程打包的时候报错找不到module,后来改了版本又报错Error:error:0308010C:digitalenveloperoutines::unsupported报错原因:node17+版本对发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响.解决方案:在网上搜索......