1. 程式人生 > >貪心演算法——另一種找最大值情況

貪心演算法——另一種找最大值情況

尋找最大數(三)
時間限制:1000 ms | 記憶體限制:65535 KB
難度:2
描述
給出一個整數N,每次可以移動2個相鄰數位上的數字,最多移動K次,得到一個新的整數。
求這個新的整數的最大值是多少。
輸入
多組測試資料。
每組測試資料佔一行,每行有兩個數N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100).
輸出
每組測試資料的輸出佔一行,輸出移動後得到的新的整數的最大值。
樣例輸入
1990 1
100 0
9090000078001234 6
樣例輸出
9190
100
9907000008001234

思考方法:整體思路是我們要把大的數字在不超過可移動步數的情況下儘可能地往前移動,使其成為高位上的數字。在給定了可移動步數K的情況下,這一次的移動就只能是在前K個數字裡去找了。所以思路比較清晰,從最高位開始,在前K個數字裡找到最大值,使其移動到最高位;然後開始找下一位,這次找的位數範圍是(K減去剛才已經移動了的步數),找到最值後還是移動到最前邊來,然後K再減去移動的步數,直到K變為了0,或者已經查詢到了最末端。

程式碼如下:

#include<stdio.h>
#include<string.h>
int main()
{
    int k;
    char a[25];
    while(scanf("%s%d",a,&k)!=EOF)
    {
        int l,i,j,t;
        l=strlen(a);
        char temp;
        for(i=0;i<l&&k!=0;i++)
        {
            t=i; 
            temp=a[i];
            for
(j=i+1;j<=i+k&&j<l;j++) { if(a[j]>temp) { t=j; temp=a[j]; } } for(j=t;j>i;j--) { a[j]=a[j-1]; k--; } a[i]=temp; } printf
("%s\n",a); } return 0; }