Codeforces Round #249 (Div. 2) B. Pasha Maximizes

OpenSoucre發表於2014-06-13

看到題目的時候,以為類似插入排序,比較第i個元素和第i-1個元素,

如果第i個元素比第i-1個元素小,則不交換

如果第i個元素比第i-1個元素大,則交換第i個元素和第i-1個元素

  繼續比較第i-1個元素與前一個元素,直到前一個元素大為止

交換元素次大於等於k則停止

但對測試用例

1234 3

則出現問題,如果按照上述方法得到答案為3214,

但正確答案是4321,直接將第4個元素往前交換

故在上面基礎上改進得

當掃描第i個元素時,則要取出[i,i+k+1)之間的最大元素,然後將最大元素往前交換,則交換後第i個元素肯定是最大的

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main(){
    string s;
    int k;
    cin >> s >> k;
	int len = s.length();
    for(int i = 0 ; i < len; ++ i){
		int maxIndex = i;
		for(int j = i +1; j < min(len,i+k+1); ++ j){
			if(s[maxIndex] < s[j]) maxIndex = j;
		} 
		for(int j = maxIndex; j > i; --j){
			swap(s[j],s[j-1]);
			k--;
		}
    }
    cout<<s<<endl;
}

  

 

相關文章