题意要求权值最小和经过字符数最多。首先考虑权值最小,易得权值必然大于等于|s1-sn|,故最小权值必然为|s1-sn|,然后将字符串排序,根据s1与sn之间的大小关系确定是升序选择字符还是降序。
代码如下
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct op {
char a;
int p;
} str[300500];
string s;
int n, len;
int cost, cmp;
int ans[300500];
bool cmp1(op l, op r) {
if (l.a == r.a) return l.p < r.p;
return l.a > r.a; // 如果s1>sn
}
bool cmp2(op l, op r) {
if (l.a == r.a) return l.p < r.p;
return l.a < r.a; // 如果s1<sn
}
int main() {
cin >> n;
for (int x = 1; x <= n; x++) {
cin >> s;
len = s.length();
for (int y = 0; y < len; y++) {
str[y + 1].a = s[y];
str[y + 1].p = y + 1;
}
cmp = 0, cost = max(str[1].a - str[len].a, -str[1].a + str[len].a);
if (str[1].a > str[len].a) {
char temp = str[1].a;
char end = str[len].a;
sort(str + 1, str + len + 1, cmp1);
for (int x = 1; x <= len; x++) {
if (str[x].a < end) {
break;
}
if (str[x].a <= temp) {
temp = str[x].a;
cmp++;
ans[cmp] = str[x].p;
}
}
} else {
char temp = str[1].a;
char end = str[len].a;
sort(str + 1, str + len + 1, cmp2);
for (int x = 1; x <= len; x++) {
if (str[x].a > end) {
break;
}
if (str[x].a >= temp) {
temp = str[x].a;
cmp++;
ans[cmp] = str[x].p;
}
}
}
cout << cost << " " << cmp << endl;
for (int x = 1; x <= cmp; x++) {
cout << ans[x] << " ";
}
cout << endl;
}
return 0;
}