题意:构造一个序列,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:
1
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();
}