51nod1621 花錢買車牌 排序 貪心

2021-08-15 11:17:23 字數 1836 閱讀 2625

1621 花錢買車牌

codeforces

基準時間限制:1 秒 空間限制:131072 kb 分值: 20

難度:3級演算法題

乙個車牌號由

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其中的乙個數,然後就是排序的小細節(只為字典序)。細細揣摩。

code:

#include #define inf 12345678

using namespace std;

const int ax = 1e4+66;

int n , k ;

char s[ax];

int a[ax];

struct node

ans[ax];

bool cmp( const node &a , const node &b )

}int main()

} if( falg )

int cost = 0;

sort( ans , ans + n , cmp );

int kk = k - a[val];

for( int i = 0 ; i < n ;i++ )

}char tmp[ax];

for( int i = 0 ; i < n ; i++ )

if( coss != -1 )

}else if( coss == cost )}}

}else

}} cout << coss << endl;

for( int i = 0 ; i < n ; i++ )

cout << endl;

}else

return 0;

}

51nod1621 花錢買車牌

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

51Nod1621 花錢買車牌

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

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

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