Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm

186 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

传送门 image.png

题意:

给你a和b两组长度为n,大小为[1,1e9)的数。现有一种操作:将某个数替换成这个数的位数。问你至少进行多少次操作可以让a和b中的数一一相等。

思路:

看完题之后,首先可以知道一个数最多执行两次操作,根据贪心的思想: 1、首先可以将原a,b中能配对的剔除 2、在剩下的数中,再将大于等于10的数各执行一次操作(因为此时这些数肯定都不能匹配),然后再剔除改变后数组中能匹配的数 3、最后剩下的数都要执行一次操作(即变为1)。 在我的ac代码中,将第二和第三部合为一步

using namespace std; 
int a[200005],b[200005];

int get_bit(int num)
{
	int res = 0;
	while(num){
		res++;
		num/=10;
	}
	return res;
}
void solve()
{
	map<int,int>vis,visa,visb;
	vector<int>aa,bb;
	int n;
	cin>>n;
	for(int i = 1; i <= n; i++){
		cin>>a[i];
		vis[a[i]]++;
	}
	for(int i = 1; i <= n; i++){
		cin>>b[i];
		if(vis[b[i]])vis[b[i]]--;
		else{
			bb.push_back(b[i]);
			if(b[i] < 10)visb[b[i]]++;
		}
	}
	for(int i = 1; i <= n; i++)
	{
		if(vis[a[i]]){
			aa.push_back(a[i]);
			vis[a[i]]--;
			if(a[i] < 10){
				visa[a[i]]++;
			}
		}
		
	}
	int ans = 0;
	for(int i = aa.size()-1; i >= 0; i--){
		int bit = get_bit(aa[i]);
		if(aa[i] >= 10){
			visa[aa[i]]--;
			aa[i] = bit;
			visa[aa[i]]++;
			ans++;
		}
	}
	for(int i = bb.size()-1; i >= 0; i--){
		int bit = get_bit(bb[i]);
		if(bb[i] >= 10){
			visb[bb[i]]--;
			bb[i] = bit;
			visb[bb[i]]++;
			ans++;
		}
	}
	sort(aa.begin(),aa.end());
	for(int i = 0; i < aa.size(); i++){
		if(visb[aa[i]])visb[aa[i]]--;
		else if(aa[i] == 1)ans++;
		else if(visb[1])ans++,visb[1]--;
		else if(!visb[aa[i]])ans+=2;
	}
	cout<<ans<<endl;
}

int main()
{
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}```