[codeforces 1339B] Sorted Adjacent Differences 排序后将数据分组,合并

Codeforces Round #633 (Div. 2)   比赛人数12032

[codeforces 1339B]   Sorted Adjacent Differences   排序后将数据分组,合并

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1339/problem/B

ProblemLangVerdictTimeMemory
B - Sorted Adjacent Differences GNU C++17Accepted78 ms800 KB

该题思维难度较大,一度做不出,转战到C题,攻克后,重回B题,好不容易才攻克,万幸。

|a1−a2|≤|a2−a3|

面对上述不等式,想遍了4种情况

(a1-a2)<=(a2-a3)

(a1-a2)<=-(a2-a3)

-(a1-a2)<=(a2-a3)

-(a1-a2)<=-(a2-a3)

无果。

将数组a排序观察,突然,灵光一闪,算法有了,

核心思想:将数组数据分组,让差异小的数据放前,差异大的数据放后。

手工算法如下

6
5 -2 4 8 6 5

5 5 4 6 8 -2

数组自小到大排序
-2 4 5 5 6 8
分2组
(-2 4 5) (5 6 8)
第1组逆序
(5 4 -2)
在第1组中间隔插入第2组数据
5 (5) 4 (6) -2 (8)

对应的输出为
5 5 4 6 -2 8

4
8 1 4 2

1 2 4 8
数组自小到大排序
1 2 4 8
分2组
(1 2) (4 8)
第1组逆序
(2 1)
在第1组中间隔插入第2组数据
2 (4) 1 (8)

对应的输出为
2 4 1 8

再举一组n是奇数的情况

5
5 -2 4 8 6

5 4 6 8 -2

数组自小到大排序
-2 4 5 6 8
分2组
(-2 4 5) (6 8)
第1组逆序
(5 4 -2)
在第1组中间隔插入第2组数据
5 (6) 4 (8) -2

比赛时,代码写得乱糟糟的,对n还分奇数,偶数进行讨论,这也是没办法,比赛时,因受各种因数影响,智力水平往往要将一档。

#include <cstdio>
#include <algorithm>
#define maxn 100010
using namespace std;
int a[maxn],b[maxn];
int cmp1(int a,int b){//自小到大排序
	return a<b;
}
int cmp2(int a,int b){//自大到小排序
	return a>b;
}
int main(){
	int t,n,i;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(i=1;i<=n;i++)scanf("%d",&a[i]);
		if(n%2==0){//n是偶数
			sort(a+1,a+1+n,cmp2);
			for(i=1;i<=(n+1)/2;i++)
				b[i*2-1]=a[(n+1)/2+i];//奇数项处理
			sort(a+1,a+1+n,cmp1);
			for(i=1;i<=(n+1)/2;i++)
				b[i*2]=a[(n+1)/2+i];//偶数项处理
		}else{//n是奇数
			sort(a+1,a+1+n,cmp2);
			for(i=1;i<=(n+1)/2;i++)
				b[i*2-1]=a[(n+1)/2+i-1];//奇数项处理
			sort(a+1,a+1+n,cmp1);
			for(i=1;i<=(n+1)/2;i++)
				b[i*2]=a[(n+1)/2+i];//偶数项处理
		}
		for(i=1;i<n;i++)printf("%d ",b[i]);
		printf("%d\n",b[n]);
	}
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值