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
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Sorted Adjacent Differences | GNU C++17 | Accepted | 78 ms | 800 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;
}