蓝桥杯 十一届C++A组 字符排序 21分(运行超时)

本文介绍了一种在冒泡排序中通过贪心策略减少逆序对的方法,通过确定不同长度的逆序对数量并利用DFS进行部分修改,以达到目标逆序对数。核心是通过严格递减的字符串构造来最大化位数利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

1. 此题考查的冒泡排序中的交换次数,其实就是考察当前数与后面的逆序对个数问题。而为了最大利用位数,应当使每一位都不小于后面的字符,否则会造成一次逆序对的浪费(贪心,为了使总位数最少)。

2. 通过上面的思路,可以得知每一个不同长度的最大逆序对数量,一定是由严格递减的字符串组成。而如果要获得逆序对数量介于相邻长度之间的数只需要对逆序对数量较大的进行部分修改即可。

3. 修改采用dfs进行判断。

#include <bits/stdc++.h>
using namespace std;
int i=2;int a;
int ans[1000];
bool check()
{
	int sum=0;
	int pre = 0,cnt = 1;
	for(int j=2;j<=i;j++)
	{
		if(ans[j] == pre)
		{
			
			cnt++;sum+=j-cnt;
		}
		else
		{
			pre = ans[j];
			cnt = 1;
			sum+=j-1;
		}
	}
//	for(int j = i;j>=1;j--)
//		{
//			cout<<(char)(ans[j]+'a');
//		}cout<<"           "<<sum<<endl;
	if(sum == a)
	{
		for(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值