排序 (爱思创算法四)(期中测试)(答案记录)

前言:

这篇文章还是是为了帮助一些

像我这样的菜鸟

找到简单的题解

题目描述

小思老师现在拿到了一个数字序列,

这个数字序列恰好由1到n这n个数字组成,

但这些数字可能没有排序。

由于小思老师平时工作比较忙,

她每次只能针对这n个数的一个子区间进行排序,

比如:给定一个区间[l, r],将这个区间从小到大排序,需要花费r-l+1个精力。

现在小思老师可以执行若干次这样的操作,

直到这个序列中所有的数字从1到n升序排列。

小思老师想知道,她需要花费的精力最少是多少?

输入描述

本题有多组询问,第一行有一个数T表示询问组数。

对于每组询问:

第一行给出一个整数n

第二行n个整数,由空格隔开,代表待排序的序列。

输出描述

T行,每行一个整数表示一组询问的答案。

输入样例#1

2
3
1 3 2
4
3 2 1 4

输出样例#1

2
3

提示

对于30%的数据,T组中所有n的累加和 <= 5000

对于100%的数据,T组中所有n的累加和 <= 100000 1<=T<=100000

本题线下文件测评时的说明:

- 可执行文件名:sort

- 提交源程序文件名:sort.cpp

- 输入文件名:sort.in

- 输出文件名:sort.out

- 时间限制:1秒

- 空间限制:256MB

完整代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N],b[N];
int n; 
int main()
{
	//freopen("sort.in","r",stdin);
	//freopen("sort.out","w",stdout);
	int t;
	cin>>t;
	while(t--)
	{
		memset(b,0,sizeof(b));
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			if(a[i]>i)
			{
				b[i]++;
				b[a[i]+1]--;
			}
		}
		for(int i=1;i<=n;i++)
		{
			a[i]=a[i-1]+b[i];
			if(a[i]) ans++;
		}
		cout<<ans<<endl;
	}
	return 0;
}

AC

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值