C. Jumping on Tiles codeforces1729C

Problem - C - Codeforces

题目大意:给出一个字符串s,从第一个字符开始,每次可以移动到任意一个字符,费用为两个字符的差值,问在费用最低的情况下,怎么用最多的步数到字符串最后一个字符

思路:费用最小值就等于第一个字符到最后一个字符的费用,要想步数最多,就要依次经过头尾两个字符中间的字符,用一个结构体储存字符和他在字符串中的位置,如果头字符大于尾字符,就按字符从大到小排序,否则按从小到大排序,然后遍历排序后的数组,找到头元素后,记录步数,将字符位置记录到数组里,知道找到尾字符后退出循环

#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 2e5 + 5;
struct ch
{
	char c;
	int po;
}a[N];
int p[N];
bool cmp(ch a, ch b)
{
	if (a.c == b.c)
		return a.po < b.po;
	return a.c > b.c;
}
bool cmp2(ch a, ch b)
{
	if (a.c == b.c)
		return a.po < b.po;
	return a.c < b.c;
}
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		string s;
		cin >> s;
		int len = s.length();
		int cnt = 0;
		for (int i = 0; i < len; i++)
		{//a储存字符和字符的位置
			a[++cnt].c = s[i];
			a[cnt].po = cnt;
		}
		if (s[0] > s[len - 1])
		{//头字符大于尾字符就从大到小排序
			sort(a + 1, a + len + 1, cmp);
		}
		else
		{
			sort(a + 1, a + len + 1, cmp2);
		}
		printf("%d", abs(s[0] - s[len - 1]));
		int ans = 0;
		bool temp = 0;
		for (int i = 1; i <= len; i++)
		{
			if (!temp&&a[i].c == s[0])
			{//找到了头字符
				temp = 1;
				p[++ans] = a[i].po;
			}
			else if (a[i].po == len)
			{//找到了尾字符
				p[++ans] = a[i].po;
				break;
			}
			else if (temp)
			{//头字符和尾字符之间的元素
				p[++ans] = a[i].po;
			}							
		}
		printf(" %d\n", ans);
		for (int i = 1; i <= ans; i++)
		{
			printf("%d ", p[i]);
		}
		printf("\n");
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timidcatt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值