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个数走偶数位

#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;
}
View Code

 

方法二: 先排序, n为奇数为no, 然后构造, 构造后满足相邻两数不相等则yes反之no, 构造方法也是前n/2个数走单数位, 后n/2个数走偶数位

#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;
}
View Code

 

posted @ 2022-09-07 17:20  la-la-wanf  阅读(29)  评论(0编辑  收藏  举报