CodeForces 1513A - Array and Peaks 题解(小白的第一篇博客)

 题意:构造一个序列,1 - n中每个数字出现次数不超过1次,能否构造出k个峰。(满足条件A[i] > A[i - 1] && A[i] > A[i + 1])

 思路:初始化序列,然后知道n中至多有多少个峰。偶数则是 n / 2 - 1,奇数为 n / 2。将序列排序。在我们的k中,只需要先输出左边的值,再输出右边值即可满足,输出的值打上标记,最后遍历一遍,将未打上标记的值输出即可。

Input:

5
1 0
5 2
6 6
2 1
6 1
Output:


2 4 1 5 3 
-1
-1
1 3 6 5 4 2
 

AC代码

#include <bits/stdc++.h>

using namespace std;
#define ref(i, m, n) for(int i = m;i <= n;++i)
#define rof(i, m, n) for(int i = m;i <  n;++i)
#define rfor(i, m, n) for(int i = m;i >= n; --i)
#define wr(n) cin >> n
#define wh(n) while(n--)
#define put(n) cout << n << '\n'
#define int long long
int p[105];
void solve()
{
    CLR(vis,0);
    int l,r; cin >> l >> r;
    ref(i,1,l) p[i] = i;//赋初始值
    sort(p + 1,p + 1 + l);
    int pe = l % 2 == 0 ? l / 2 - 1 : l / 2;//代表l这个值最多有多少个顶峰
    if(r == 0)//直接输出就行
    {
        ref(i,1,l) cout << p[i] << ' '; cout << '\n';
        return;
    }
    if(r > pe)//如果超过了最多的顶峰就输出-1
    {
        put(-1);
        return;
    }
    bool f = 0;

    ref(i,1,r)
    {
        cout << p[i] << ' ' << p[l - i + 1] << ' ';
        vis[p[i]] = 1;//标记输出过了
        vis[p[l - i + 1]] = 1;//标记输出过了
    }

    ref(i,1,l)
        if(!vis[p[i]])//未标记的输出
            cout << p[i] << ' ';
        
    cout << '\n';
    return;
}

signed main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int t = 1;wr(t);
    wh(t) solve();
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值