n个数 ,n为奇数,问是否可以重构造一个数组使下标为偶数的数字大于前一个数和后一个数。
先对数组排序,再定义一个数组让大的数字排在偶数位,小的数字排在奇数位。再检索这个新数组。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int a[N],b[N];
int main()
{
int n;
cin>>n;
for(int i = 1 ; i <= n ; i++) scanf("%d",&a[i]);
sort(a+1 , a+n+1);
int p = n;
for(int i = 2 ; i <= n ; i += 2 ) b[i] = a[p--];
for(int i = 1 ; i <= n ; i += 2) b[i] = a[p--];
int flag = 0;
for(int i = 2 ; i <= n ; i += 2)
{
if(!(b[i] > b[i-1] && b[i] > b[i+1]))
{
flag = 1;
break;
}
}
if(flag) cout<<"No"<<'\n';
else cout<<"Yes"<<'\n';
return 0;
}
B - Exactly Three Bits
给定一个数字n问二进制位是否有三个1,如果个数大于3则找出最大的小于n的有3个1的数字。
不可能输出-1。首先这个数字如果小于7则不可能找到3个1.直接输出-1. 一个数字&1可判断最低为是否为1,再持续右移即可找出有多少1.如果小于3则循环递减。如果大于3的话,只需要把最低位的1去掉即可,可以用这个数字减去这个数字&它的相反数,这样可以直接去掉最低为的1.
#include<bits/stdc++.h>
using namespace std;
int long long lowbit(int long long x) { return (x & (-x));}
void solve()
{
int long long x;
cin>>x;
if(x < 7) { cout<<"-1"<<'\n' ; return ; }//找到最低位的1
while(1)
{
int cnt = 0;
int long long p = x;
while(p)
{
if(p & 1) cnt++;
p = p >> 1;
}
if(cnt == 3) {cout<<x<<'\n' ; break;}
if(cnt > 3)
{
while(cnt > 3)
{
x -= lowbit(x);
cnt--;
}
cout<<x<<'\n';
break;
}
x--;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--) { solve() ;}
return 0;
}