【2024年中山市东区】刷题顺序(prob)

题目描述

为了在某谷上挑战 Chen,不知何时燃起了雄心壮志的 Jimmy 在某谷上准备好了 N 道题目,打算组建一次正式的比赛,从而把 Chen 难倒。可是,他却在组建比赛时遇到了技术难题。

为了更好地照顾不同层次的参赛者,Jimmy 所出的每道题目都有各自的难度,具体来说,第 i 道题目的难度为 Di​。Jimmy 把题目按顺序添加上去后,发现他忘了考虑每道题的难度——Jimmy 当然是希望简单题在前、难题在后的,也就是题目应该按难度从小到大排序,因此他需要调整一下题目的顺序。可是某谷的系统刚好出了问题,只允许他每次对两道位置间隔为 K 的题目交换位置,例如第 1 题和第 K+1 题、第 2 题和第 K+2 题,依次类推。

Jimmy 可不想把辛辛苦苦加好的题目删掉。请你告诉他,经过次数不限的交换位置后(当然也可以不做交换),题目难度能否做到从小到大排好序。

输入

本题有多组数据。

第一行一个正整数 T,表示数组的组数。接下来一共有 2×T 行,为每组数据的具体内容。

每组数据的第一行,为两个正整数 N,K,表示一共有 N 道问题,每次交换只能对两道位置间隔为 K 的问题交换位置。

每组数据的第二行,为 N 个正整数 D1​,D2​,⋯,DN​,表示每道问题的难度。

输出

输出一共 T 行。对于每组数据,如果最终能做到题目按难度从小到大排序,输出一行 yes,否则输出一行 no

样例数据
输入 #1 复制
3
5 2
3 4 1 3 4
5 3
3 4 1 3 4
7 5
1 2 3 4 5 5 10
输出 #1 复制
yes
no
yes
数据范围限制

对于 100% 的数据,满足 1≤T≤5,1≤N≤5000,1≤K<N,1≤Di​≤109。

提示

样例中一共有三组数据:

第一组数据中 K=2,意味着 Jimmy 每次只能交换两道位置间隔为 2 的题目。Jimmy 可以先交换第 1 题和第 3 题,交换后的题目难度为 1 4 3 3 4。然后再交换第 2 题和第 4 题,交换后的题目难度为 1 3 3 4 4,刚好是从小到大排序的,因此输出一行 yes

第二组数据中,不存在任何操作方案,使得题目按难度从小到大排序,因此输出一行 no

第三组数据中,题目本来就是按照难度从小到大排序的,Jimmy 不用做任何交换操作,因此输出一行 yes

参考代码:

#include<bits/stdc++.h>
using namespace std;
int t,k,n,a[5001],b;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
		for(int i=1;i<=n;i++)
			cin>>a[i];
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n-k;j++)
				if(a[j]>a[j+k])
					swap(a[j],a[j+k]);
		bool b=0;
		for(int i=2;i<=n;i++)
			if(a[i]<a[i-1])
			{
				cout<<"no\n";
				b=1;
				break;
			}
		if(b==0)
			cout<<"yes\n";
	}
	return 0;
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值