本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题意:
给你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();
}
}```