Codeforces Round #794 (Div. 1) A

原题链接:https://codeforces.com/contest/1685/problem/A

题目

给定序列a,将a重新排序得到环形序列b(即b0=bn),使其对于任意i满足:

  • bi1<bi>bi+1

或者

  • bi1>bi<bi+1

换句话而言,b排列在一个圆圈上,是否使每个数字都严格大于其邻居或严格小于其邻居?

分析

如果n是奇数,则一定无解。

首先将序列a进行排序。

不考虑数字重复,则易得序列(a1,am+1,a2,am+2,,am,a2m)一定成立。

考虑数字重复的话,如果重复数字大于n/2个,则一定不成立,得到序列一定会有重复数字。

如果重复数字等于n/2的话,则需要考虑是否是最大、最小的数字了,除非是最大或最小的数字可以构成一大一小的序列顺序,否则都无解。

code

#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { int tc; cin >> tc; while(tc--) { int n; cin >> n; vector<ll>a(n); for(auto &i:a) scanf("%lld",&i); int flag = 1; if(n%2) flag = 0; int cnt = 1; sort(a.begin(),a.end()); for(int i = 1 ; i < n ; i++) { if(a[i] == a[i-1]) cnt++; else cnt = 1; if(cnt*2>n) flag = 0; if(cnt*2==n && i >= n/2 && i != n-1) flag = 0; } if(flag==1) { cout << "YES"<< endl; vector<ll>ans; int l = 0, r = 0, mid = n/2; for(int i = 0 ; i < n ; i++) { if(i%2) { ans.push_back(a[mid+r++]); } else ans.push_back(a[l++]); } for(int i = 0 ; i < n ; i++) cout << ans[i] << " "; cout << endl; } else { cout << "NO" << endl; } } }

__EOF__

本文作者seekerzhz
本文链接https://www.cnblogs.com/zhaohanzheng/p/16344011.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   seekerHeron  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示