描述
給出乙個整數n,每次可以移動2個相鄰數字上的數字,最多移動k次,得到乙個新的整數。
求這個新的整數的最大值是多少。
輸入 多組測試資料。
每組測試資料佔一行,每行有兩個數n和k (1 ≤ n≤ 10^18; 0 ≤ k ≤ 100).
輸出 每組測試資料的輸出佔一行,輸出移動後得到的新的整數的最大值。
樣例輸入
1990 1
100 0
9090000078001234 6
樣例輸出
9190
100
9907000008001234
思路:貪心演算法
運用貪心演算法,就要能夠找到問題的子問題。這樣就可以迴圈下去,直到結束。
輸入的資料用字串表示,因為字串最多隻需18個字元,而用int ,就必須能夠表示10^18 ,不知道long long int 能不能表示,而且後面還不好處理
問題分析
分析發現,最有影響力的是最高位。所以第一步是將s[1~(n-1)]最高位調到最大(在只能變動k的情況下),然後再調其他位。將剩下的s[2~(n-1)]作為子問題,繼續上面步驟。
偽**:
for((i=0~n-1) && k>0 )
}printf(s)
**
#include
#include
int findk(char* s,int i,int k);
void change(char* s,int i,int h);
int main()
; int k=0;
int n=0;
int i=0;
int h=0,x=0;
while(scanf("%s",s)!=eof)//scanf(%s)不能存放空格,認為空格就是回車鍵 ,二gets()將空格視為乙個普通字元
else
if(s[h]>s[i])
}printf("%s\n",s);
}return0;}
int findk(char* s,int i,int k)
void change(char* s,int i,int h)
return;
}
尋找最大數(三)
描述 給出乙個整數n,每次可以移動2個相鄰數字上的數字,最多移動k次,得到乙個新的整數。求這個新的整數的最大值是多少。輸入多組測試資料。每組測試資料佔一行,每行有兩個數n和k 1 n 10 18 0 k 100 輸出每組測試資料的輸出佔一行,輸出移動後得到的新的整數的最大值。樣例輸入1990 1 1...
尋找最大數(三)
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 給出乙個整數n,每次可以移動2個相鄰數字上的數字,最多移動k次,得到乙個新的整數。求這個新的整數的最大值是多少。輸入 多組測試資料。每組測試資料佔一行,每行有兩個數n和k 1 n 10 18 0 k 100 輸出每組測試資料的輸...
尋找最大數(三)
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 給出乙個整數n,每次可以移動2個相鄰數字上的數字,最多移動k次,得到乙個新的整數。求這個新的整數的最大值是多少。輸入 多組測試資料。每組測試資料佔一行,每行有兩個數n和k 1 n 10 18 0 k 100 輸出 每組測試資料的...