cf#794 (Div. 1) A. Circular Local MiniMax
好久不打了, 都还回去了, 脑子也不好使了
A. Circular Local MiniMax
Problem - 1685A - Codeforces 难度: 1100 类型: constructive algorithms, greedy
题意
一串数组成一个闭环圆圈, 每个数字是山峰(大于旁边两个数)或者丘壑(小于旁边两个数), 不可以构成输出NO, 反之输出YES和构造结果
题解
个人喜欢方法二
方法一 : 先排序, n为奇数为no, 某个数的个数>n/2也为no, 其余为yes, 然后构造, 前n/2个数走单数位, 后n/2个数走偶数位
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> PII; const int N = 1e5+10; int a[N]; int main() { int t; cin >>t; while(t --) { int n; cin >> n; for(int i = 0; i < n; i ++) cin >> a[i]; sort(a , a+n); if(n%2||a[n/2]==a[n/2-1]&&count(a,a+n,a[n/2])>=n/2) puts("NO"); else { puts("YES"); for(int i = 0; i < n/2; i ++) cout << a[i] << ' '<< a[i+n/2] << ' ' ; cout << endl; } } return 0; }
方法二: 先排序, n为奇数为no, 然后构造, 构造后满足相邻两数不相等则yes反之no, 构造方法也是前n/2个数走单数位, 后n/2个数走偶数位
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> PII; const int N = 1e5+10; int a[N], b[N]; int main() { int t; cin >>t; while(t --) { int n; cin >> n; for(int i = 0; i < n; i ++) cin >> a[i]; sort(a , a+n); if(n%2) puts("NO"); else { bool f = 1; for(int i = 0; i < n; i +=2) b[i] = a[i/2];//构造b[]数组 for(int i = 1; i < n; i += 2) b[i] = a[n/2+i/2]; for(int i = 0; i < n-1; i ++) if(b[i] == b[i+1])f=0; if(!f)puts("NO"); else { puts("YES"); for(int i = 0; i < n; i ++) cout << b[i] << ' ' ; cout << endl; } } } return 0; }