给定值“ N” ,它是数字“ A”的长度。您的任务是转换数字,以使数字“ A”中至少存在“ K”次任何数字。为了替换“ N”个数字之一,您还需要计算成本,即旧数字与新数字之间的绝对差。任务是打印将初始编号转换为最终编号所需的最低成本,同时打印最终编号。
注意:如果有多个这样的数字,则按字典顺序打印最小的数字。
例子:
Input: N = 6, K = 5, A = 898196
Output: 4, 888188
Number = “898196”, the second digit as “9” will be replaced to “8” costs |9 – 8| = 1 . Replacing the fifth digit with an “8” will cost the same. Replacing the fifth digit cost |6 – 8| = 2. As a result, 4 will be the total cost and the final number will be “888188”.
Input: N = 16, K = 14, A = 6124258626539246
Output: 22, 4444448444449444
方法:
- 初始化长度为“ N”的数字“ A”。
- 初始化PAIR STL以存储最小成本和数量。
- 将数字作为字符串存储在temp变量中。
- 使用两个for循环检查所有具有“ j”差的数字并将其替换为“ i”,如果达到成本则中断。
- 用上一个替换最低成本。
- 最后,打印最低成本和最终编号。
下面是上述方法的实现:
C++
// C++ program to illustrate
// the above problem
#include
using namespace std;
// function to calculate the minimum
// value and the final number
int finalNumber(int n, int k, string a)
{
// modtemp = modified temp string
int modtemp;
// store the count of numbers changed to k
int co;
// temporary temp string
string temp;
// To store the minimum cost and no
pair ans = make_pair(INT_MAX, "");
for (int i = 0; i < 10; i++) {
// 'i' will replace the digits of N's to
// generate a number with k same digits
// store the main str in temp str for modification
temp = a;
// To store the temporary value of the modified number
modtemp = 0;
// Initial count for the given number to replace 'i'
co = count(a.begin(), a.end(), i + '0');
// 'j' manages the difference 'i' and 'j'
for (int j = 1; j < 10; j++) {
// For the elements ahead of 'i' index
if (i + j < 10) {
// Checks all elements with difference 'j'
// and replaces them with 'i'
for (int p = 0; p < n; p++) {
// Break if count is achieved
if (co >= k)
break;
if (i + '0' == temp[p] - j) {
// Replaces all elements with difference
// 'j' and with 'i'
temp[p] = i + '0';
modtemp += j;
co++;
}
}
}
// For the elements before 'i' index
if (i - j >= 0) {
for (int p = n - 1; p >= 0; p--) {
if (co >= k)
break;
if (i + '0' == temp[p] + j) {
temp[p] = i + '0';
modtemp += j;
co++;
}
}
}
}
// replace the minimum cost with the previous one
ans = min(ans, make_pair(modtemp, temp));
}
// print the minimum cost and the final number
cout << ans.first << endl
<< ans.second << endl;
}
// Driver code
int main()
{
// initilaize number length and k
int n = 5, k = 4;
// initialize the number
string a = "21122";
finalNumber(n, k, a);
return 0;
}
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
static class pair
{
int first;
String second;
static pair make_pair(int first, String second)
{
pair p = new pair();
p.first = first;
p.second = second;
return p;
}
}
// count for the given character
static int count(String a,char c)
{
int co = 0;
for(int i = 0; i < a.length(); i++)
if(a.charAt(i) == c)
co++;
return co;
}
// function to calculate the minimum
// value and the final number
static int finalNumber(int n, int k, String a)
{
// modtemp = modified temp String
int modtemp;
// store the count of numbers changed to k
int co;
// temporary temp String
char temp[] = new char[a.length()];
// To store the minimum cost and no
pair ans = pair.make_pair(Integer.MAX_VALUE, "");
for (int i = 0; i < 10; i++)
{
// 'i' will replace the digits of N's to
// generate a number with k same digits
// store the main str in temp str for modification
temp = a.toCharArray();
// To store the temporary value of the modified number
modtemp = 0;
// Initial count for the given number to replace 'i'
co = count(a, (char)(i + '0'));
// 'j' manages the difference 'i' and 'j'
for (int j = 1; j < 10; j++)
{
// For the elements ahead of 'i' index
if (i + j < 10)
{
// Checks all elements with difference 'j'
// and replaces them with 'i'
for (int p = 0; p < n; p++)
{
// Break if count is achieved
if (co >= k)
break;
if (i + '0' == temp[p] - j)
{
// Replaces all elements with difference
// 'j' and with 'i'
temp[p] = (char)(i + '0');
modtemp += j;
co++;
}
}
}
// For the elements before 'i' index
if (i - j >= 0)
{
for (int p = n - 1; p >= 0; p--)
{
if (co >= k)
break;
if (i + '0' == temp[p] + j)
{
temp[p] = (char)(i + '0');
modtemp += j;
co++;
}
}
}
}
// replace the minimum cost with the previous one
if(ans.first > modtemp)
ans = pair.make_pair(modtemp, new String(temp));
}
// print the minimum cost and the final number
System.out.print( ans.first + "\n"
+ ans.second + "\n");
return -1;
}
// Driver code
public static void main(String args[])
{
// initilaize number length and k
int n = 5, k = 4;
// initialize the number
String a = "21122";
finalNumber(n, k, a);
}
}
// This code is contributed by Arnab Kundu
Python3
# Python3 program to illustrate
# the above problem
import sys
# function to calculate the
# minimum value and the final
# number
def finalNumber(n, k, a):
# To store the minimum
# cost and no
ans = [sys.maxsize, ""]
for i in range(10):
# 'i' will replace the
# digits of N's to generate
# a number with k same digits
# store the main str in temp
# str for modification
temp = a
# To store the temporary
# value of the modified number
modtemp = 0
# Initial count for the
# given number to replace 'i'
co = a.count(chr(i + ord('0')))
# 'j' manages the difference
# 'i' and 'j'
for j in range(1, 10):
# For the elements ahead
# of 'i' index
if (i + j < 10):
# Checks all elements with
# difference 'j' and replaces
# them with 'i'
for p in range(n):
# Break if count is
# achieved
if (co >= k):
break
if (i + ord('0') ==
ord(temp[p]) - j):
# Replaces all elements
# with difference 'j'
# and with 'i'
temp.replace(temp[p],
chr(i +
ord('0')), 1)
modtemp += j
co+= 1
# For the elements
# before 'i' index
if (i - j >= 0):
for p in range(n - 1,
-1, -1):
if (co >= k):
break
if (i + ord('0') ==
ord(temp[p]) + j):
temp.replace(temp[p],
chr(i +
ord('0')), 1)
modtemp += j
co += 1
# replace the minimum cost
# with the previous one
ans = min(ans, [modtemp,
temp])
# print the minimum cost
# and the final number
print(ans[0])
print(ans[1])
# Driver code
if __name__ == "__main__":
# Initilaize number
# length and k
n = 5
k = 4
# initialize the number
a = "21122"
finalNumber(n, k, a)
# This code is contributed by Chitranayal
C#
// C# program to illustrate
// the above problem
using System;
using System.Collections.Generic;
class GFG {
// count for the given character
static int count(string a,char c)
{
int co = 0;
for(int i = 0; i < a.Length; i++)
if(a[i] == c)
co++;
return co;
}
// function to calculate the minimum
// value and the final number
static int finalNumber(int n, int k, string a)
{
// modtemp = modified temp String
int modtemp;
// store the count of numbers changed to k
int co;
// temporary temp String
char[] temp = new char[a.Length];
// To store the minimum cost and no
Tuple ans = new Tuple(Int32.MaxValue, "");
for (int i = 0; i < 10; i++)
{
// 'i' will replace the digits of N's to
// generate a number with k same digits
// store the main str in temp str for modification
temp = a.ToCharArray();
// To store the temporary value of the modified number
modtemp = 0;
// Initial count for the given number to replace 'i'
co = count(a, (char)(i + '0'));
// 'j' manages the difference 'i' and 'j'
for (int j = 1; j < 10; j++)
{
// For the elements ahead of 'i' index
if (i + j < 10)
{
// Checks all elements with difference 'j'
// and replaces them with 'i'
for (int p = 0; p < n; p++)
{
// Break if count is achieved
if (co >= k)
break;
if (i + '0' == temp[p] - j)
{
// Replaces all elements with difference
// 'j' and with 'i'
temp[p] = (char)(i + '0');
modtemp += j;
co++;
}
}
}
// For the elements before 'i' index
if (i - j >= 0)
{
for (int p = n - 1; p >= 0; p--)
{
if (co >= k)
break;
if (i + '0' == temp[p] + j)
{
temp[p] = (char)(i + '0');
modtemp += j;
co++;
}
}
}
}
// replace the minimum cost with the previous one
if(ans.Item1 > modtemp)
ans = new Tuple(modtemp, new string(temp));
}
// print the minimum cost and the final number
Console.Write( ans.Item1 + "\n" + ans.Item2 + "\n");
return -1;
}
static void Main()
{
// initilaize number length and k
int n = 5, k = 4;
// initialize the number
string a = "21122";
finalNumber(n, k, a);
}
}
// This code is contributed by divyeshrabadiya07
输出:
1
21222
说明:与仅将1转换为2一样。 2变成k倍。因此成本为2-1 = 1。