51nod 1621花錢買車牌(貪心)

2021-08-09 10:48:35 字數 1702 閱讀 5380

乙個車牌號由n位數字組成。如果乙個車牌至少有k位數字是相同的,那麼我們就說這個車牌漂亮的車牌。現在華沙想要改變他自己的車牌,使得他的車牌變得漂亮。當然,改車牌是要花錢的。每改變一位數字所要花費的費用等於當前位上的新舊數字之差的絕對值。那麼總費用就是每位上所花費用的總和。

舉例如下,

舊牌為0123,新牌為7765,那麼對應第一位所花費用為|0-7|=7,第二位為|1-7|=6,第三位為|2-6|=4,第四位為|3-5|=2,總和為7+6+4+2=19

華沙想用最少的錢,使他的車牌變得漂亮起來。現在給定n,k,和舊牌的號碼,計算換牌的最少費,以及新牌的號碼,

如果最少費用的號碼有多個,我們取字典序最小的那個。

樣例解釋:

在樣例中,把第二個數字換成「8」花費|9-8|=1,把第五個數字換成「8」也花了1。

把第六個數字換成「8」花費|6-8|=2.總費用為1+1+2=4,新號碼為「888188」

兩個長度為n的序列比較方法如下。

存在兩個序列x,y,長度都是n。

如果存在i(1≤i≤n)和任意j(1≤j<i)使得 xi<yi 並且 xj=yj ,那麼我們就說x比y小。

input

單組測試資料

第一行,兩個由空格隔開的數字n和k(2≤n≤10^4,2≤k≤n),表示舊牌的位數,和至少要有k位數字相同才能構成漂亮的車牌。

第二行有n位數字,代表華沙的舊車牌。(舊車牌中只有數字)。

output

共兩行,

第一行,乙個整數,代表換牌的最小費用,

第二行,n位數字,表示新的車牌。

如果最小費用的車牌有多個,輸出字典序最小的那個。

input示例

6 5898196

output示例

4888188

題解:將字串從(0-9)的變化全部列舉一遍,列舉每種情況的時候,從列舉的數字兩側進行往外列舉,這樣保證得到的一定是列舉情況下開銷最小的,然後取10種最優的就是答案,長度不過10000,變化不過10種(0-9),每種情況下模擬不過10次。這道題答題的思路沒什麼難的,關鍵是字典序最小這個問題。

注意點:

1、列舉的時候,先進行變小的列舉,比如3-5和7-5開銷相同,那麼應該先進行列舉7變成5。

2、列舉的時候,如果是字元值在變小,應該正序列舉,否則應該倒序列舉。比如7-5的話就應該正序,3-5就應該倒序。

3、列舉出現總開銷相等的時候,應該取字典序小的一方。

**:

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 1e4+5;

const int mod = 1e9+7;

const int inf = 1<<30;

const ll llinf = 1e18+999;

int n, k, min_sum, num[10];

string ans, tmp, in;

void init( )

int main( )

if(i-j>-1) //與上述情形剛好相反

for(int v=n-1; v>-1&&need>0; v--)

if(tmp[v]-'0'==i-j)

}if(sum

51nod1621 花錢買車牌

乙個車牌號由n位數字組成。如果乙個車牌至少有k位數字是相同的,那麼我們就說這個車牌漂亮的車牌。現在華沙想要改變他自己的車牌,使得他的車牌變得漂亮。當然,改車牌是要花錢的。每改變一位數字所要花費的費用等於當前位上的新舊數字之差的絕對值。那麼總費用就是每位上所花費用的總和。舉例如下,舊牌為0123,新牌...

51Nod1621 花錢買車牌

乙個車牌號由n位數字組成。如果乙個車牌至少有k位數字是相同的,那麼我們就說這個車牌漂亮的車牌。現在華沙想要改變他自己的車牌,使得他的車牌變得漂亮。當然,改車牌是要花錢的。每改變一位數字所要花費的費用等於當前位上的新舊數字之差的絕對值。那麼總費用就是每位上所花費用的總和。舉例如下,舊牌為0123,新牌...

51nod1621 花錢買車牌 排序 貪心

1621 花錢買車牌 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 乙個車牌號由 n位數字組成。如果乙個車牌至少有 k位數字是相同的,那麼我們就說這個車牌漂亮的車牌。現在華沙想要改變他自己的車牌,使得他的車牌變得漂亮。當然,改車牌是要花錢的...