题目链接
题目大意
思路
权值最小是|a[1] - a[n]|,要在这个权值下尽可能多的跳字符,那么
如果a[1] < a[n],那么在中间就跳递增的字母。
如果a[1] > a[n],那么在中间就跳递减的字母。
也可以理解成,距离一定,在指定的距离内,经过尽可能多的站点,所以要尽量多经过顺路的站点。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
struct name{
char a;
int pos;
};
bool cmp(name a, name b)
{
return a.a > b.a;
}
bool cmp1(name a, name b)
{
return a.a < b.a;
}
int main()
{
int t;
cin >> t;
while (t -- )
{
vector<name> v;
string s;
cin >> s;
for (int i = 1; i < s.length() - 1; i ++ )
{
v.push_back({s[i], i + 1});
}
cout << abs(s[0] - s[s.length() - 1]) << " ";
if (s[0] < s[s.length() - 1])
{
int ans = 0;
sort(v.begin(), v.end(), cmp1);
for (auto i : v)
{
if (i.a >= s[0] && i.a <= s[s.length() - 1])
{
ans ++;
// cout << i.pos << " ";
}
}
cout << ans + 2 << " " << endl;
cout << 1 << " ";
for (auto i : v)
{
if (i.a >= s[0] && i.a <= s[s.length() - 1])
{
cout << i.pos << " ";
}
}
cout << s.length() << endl;
}
else
{
int ans = 0;
sort(v.begin(), v.end(), cmp);
for (auto i : v)
{
if (i.a <= s[0] && i.a >= s[s.length() - 1])
{
ans ++;
// cout << i.pos << " ";
}
}
cout << ans + 2 << endl;
cout << 1 << " ";
for (auto i : v)
{
if (i.a <= s[0] && i.a >= s[s.length() - 1])
{
cout << i.pos << " ";
}
}
cout << s.length() << endl;
}
}
return 0;
}