選靚號——拼多多筆試題(貪心+暴力)


題意

鏈接:https://www.nowcoder.com/questionTerminal/005af31a10834b3688911463065ab47d
來源:牛客網

A 國的手機號碼由且僅由 N 位十進制數字(0-9)組成。一個手機號碼中有至少 K 位數字相同則被定義為靚號。A 國的手機號可以有前導零,比如 000123456 是一個合法的手機號。
小多想花錢將自己的手機號碼修改為一個靚號。修改號碼中的一個數字需要花費的金額為新數字與舊數字之間的差值。比如將 1 修改為 6 或 6 修改為 1 都需要花 5 塊錢。
給出小多現在的手機號碼,問將其修改成一個靚號,最少需要多少錢?
輸入描述:
第一行包含2個整數 N、K,分別表示手機號碼數字個數以及靚號至少有 K 個數字相同。
第二行包含 N 個字符,每個字符都是一個數字('0'-'9'),數字之間沒有任何其他空白符。表示小多的手機號碼。
數據范圍:
2 <= K <= N <= 10000


輸出描述:
第一行包含一個整數,表示修改成一個靚號,最少需要的金額。
第二行包含 N 個數字字符,表示最少花費修改的新手機號。若有多個靚號花費都最少,則輸出字典序最小的靚號。
示例1

輸入

6 5
787585

輸出

4
777577

說明

花費為4的方案有兩種:777577與777775,前者字典序更小。

思路

枚舉每個數字(0~9)作為目標相同數字i,慢慢擴展間隔gap,貪心策略,先處理i+gap,即比i大的,而且順着替換,因為這樣會讓字典序變小;再處理i-gap,即比i小的,這里當存在的i-gap比需求need多時,要倒着遍歷替換,因為正着會讓字典序變大。

具體看代碼,還是很簡單的。

代碼

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt(), k = in.nextInt();
		StringBuilder ss = new StringBuilder(in.next());
		int a[] = new int[10];
		for (int i = 0; i < n; i++) {
			a[ss.charAt(i) - '0']++;
		}
		int ans = 0x3f3f3f3f;
		StringBuilder res = new StringBuilder();
		for (int i = 0; i <= 9; i++) {
			int need = k - a[i], gap = 1, sum = 0;
			StringBuilder s = new StringBuilder(ss);
			// System.out.println(s);
			while (need > 0) {
				// System.out.println("gg");
				if (i + gap <= 9) {
					if (a[i + gap] < need) {
						for (int j = 0; j < n; j++) {
							if (s.charAt(j) - '0' == i + gap) {
								s.setCharAt(j, (char) (i+'0'));
							}
						}
						sum += gap * a[i + gap];
						need -= a[i + gap];
					} else {
						sum += gap * need;
						for (int j = 0; j < n; j++) {
							if (s.charAt(j) - '0' == i + gap && need > 0) {
								s.setCharAt(j, (char) (i+'0'));
								need--;
							}
						}

						break;
					}
				}
				if (i - gap >= 0) {
					if (a[i - gap] < need) {
						for (int j = 0; j < n; j++) {
							if (s.charAt(j) - '0' == i - gap) {
								s.setCharAt(j, (char) (i+'0'));
							}
						}
						sum += gap * a[i - gap];
						need -= a[i - gap];
					} else {
						sum += gap * need;
						for (int j = n - 1; j > 0; j--) {
							if (s.charAt(j) - '0' == i - gap && need > 0) {
								s.setCharAt(j, (char) (i+'0'));
								need--;
							}
						}

						break;
					}
				}
				gap++;
			}
			String st = s.toString();
			String rt = res.toString();
//			System.out.println(i+" "+sum+" "+s);
			if (sum < ans) {
				ans = sum;
				res = s;

			} else if (sum == ans && st.compareTo(rt) < 0) {
				res = s;
			}
		}
		System.out.println(ans);
		System.out.println(res);
	}
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM