栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Codeforces 1686B

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Codeforces 1686B

题目描述

对于数组 [ b 1 , b 2 , … , b m ] [b_1,b_2,dots,b_m] [b1​,b2​,…,bm​],定义逆序对的数目是所有满足条件 i ≤ i < j ≤ m i le i lt j le m i≤i b j b_i>b_j bi​>bj​的整数对 ( i , j ) (i,j) (i,j)数目。如果这个数组的逆序对的数目是奇数,这个数组就是奇数组。

举个例子, [ 4 , 2 , 7 ] [4,2,7] [4,2,7]是奇数组,因为逆序对数目是 1 1 1, [ 2 , 1 , 4 , 3 ] [2,1,4,3] [2,1,4,3]不是奇数组,因为逆序对数目是 2 2 2。

给定一个从 1 1 1到 n n n的整数排列 [ p 1 , p 2 , . . . , p n ] [p_1,p_2,...,p_n] [p1​,p2​,...,pn​]。你想把它分割成一个或多个连续的子数组,使得奇子数组的数目越多越好。

所以最大的奇子数组组数是几?

输入格式

输入的第一行包含第一个整数 t ( 1 ≤ t ≤ 1 0 5 ) t(1 le t le 10^5) t(1≤t≤105)表示测试数据的组数。测试数据的描述见下。

第一行包含一个整数 n ( 1 ≤ n ≤ 1 0 5 ) n(1 le n le 10^5) n(1≤n≤105)表示排列的大小。

第二行包含 n n n个整数 p 1 , p 2 , . . . , p n ( 1 ≤ p i ≤ n ) p_1,p_2,...,p_n (1 le p_i le n) p1​,p2​,...,pn​(1≤pi​≤n),且每个 p i p_i pi​不相等,表示排列的元素。

所有测试数据的 n n n之和不超过 2 ⋅ 1 0 5 2 cdot 10 ^ 5 2⋅105。

输出格式

对所有测试数据输出一个单独的整数,表示通过将这个排列分割成多个连续子数组时的最大的可能的奇子数组的数目。

输入输出样例
输入输出
5
3
1 2 3
4
4 3 2 1
2
1 2
2
2 1
6
4 5 6 1 2 3
0
2
0
1
1
样例解释

第一个和第三个测试数据,无论我们如何分割排列都得不到奇数组。

第二个测试数据,我们可以将排列分割为 [ 4 , 3 ] [4,3] [4,3]和 [ 2 , 1 ] [2,1] [2,1],两个数组都是奇数组,因为它们的逆序对数都是 1 1 1。

第四个测试数据,我们可以将排列“分割”为 [ 2 , 1 ] [2,1] [2,1],奇数组。

第五个测试数据,我们可以将排列分割为 [ 4 , 5 ] [4,5] [4,5]和 [ 6 , 1 , 2 , 3 ] [6,1,2,3] [6,1,2,3]。第一个子数组有 0 0 0个逆序对,第二个子数组有 3 3 3个逆序对,第二个子数组是奇数组。

题解

贪心。

往右遍历数组中所有的逆序对,在没有重复的前提下把所有逆序对分割成子数组。

代码如下:

#include 
using namespace std;
int a[100001];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,cnt=0;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
		for(int i=1;i<=n-1;i++)
		{
			if(a[i]>a[i+1]) cnt++,i++;
		}
		printf("%dn",cnt);
	}
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934458.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号