字串排序
贪心算法
先找出满足排序次数的最小字符串长度。然后根据贪心算法,在总长度确定的情况下,重复字符长度越短,性价比越高,而且重复字符越靠后越好。也就是说尽量用双重复字符解决问题,如果双重复解决不了,再考虑三重复,三重复解决不了,在考虑四重复······
c++代码如下:
#include<iostream>
#include<vector>
using namespace std;
int getlen(int v) {
int i = 0;
while (v > 0) {
v -= i;
i++;
}
return i;
}
vector<int> nums;
int len;//预计最短字符串长度
void makenum(int w,int s) {
if (s == len) return;
int i = 1;
int t = 0;
while (1) {
if (len / i * t >= w) {
nums.push_back(i);
makenum(w - t,s + i);
break;
}
t += i;
i++;
}
}
int main() {
int v;
cin >> v;
len = getlen(v);//预计最短字符串长度
int m = 0;
for (int i = 0; i < len; i++) m += i; //该长度下最多交换次数;
makenum(m - v, 0);
char ch = 'a';
string ans = "";
for (int i : nums) {
//cout << i << endl;
for (int j = 0; j < i; j++) {
ans = ch + ans;
}
ch++;
}
cout << ans << endl;
return 0;
}