A:
将2*n个数进行排序,然后检验一下前面n个和 后面n个和是否相同。
AC_code
int n;
int a[2100];
int main() {
scanf("%d",&n);
for(int i =0;i<2*n;i++) scanf("%d",&a[i]);
sort(a,a+2*n);
int sum = 0;
for(int i = 0;i<n;i++) sum+=a[i];
for(int i = n;i<2*n;i++) sum-=a[i];
if(sum!=0) {
for(int i = 0;i<2*n;i++) {
cout<<a[i];
if(i != 2*n-1) cout<<' ';
else cout<<endl;
}
}
else cout<<"-1"<<endl;
return 0;
}
B:
很明显如果没有奇数或者偶数,我们的序列肯定是不能进行变化的,但如果同时存在奇数和偶数,可以证明的是我们能通过有限次变换将序列变成任意一种形式,这时候我们只要sort一下就能保证字典序最小啦。
AC_code
int n;
int a[100050];
int main() {
int odd=0,even =0;
scanf("%d",&n);
for(int i = 0;i<n;i++) {
scanf("%d",&a[i]);
if(a[i] %2 ==0) even++;
else odd++;
}
if(even == 0 || odd == 0) {
for(int i=0;i<n;i++) {
cout<<a[i];
if(i == n-1) cout<<endl;
else cout<<' ';
}
}
else {
sort(a,a+n);
for(int i=0;i<n;i++) {
cout<<a[i];
if(i == n-1) cout<<endl;
else cout<<' ';
}
}
return 0;
}
C
因为 i 为 j 如果互素, a[i] != a[j] , 所以 如果 j为质数 ,a[j] 的值肯定和前面任何数的值不同,我们用素数筛搞一下就好了.
AC_code
const int maxn = 1e5+7;
int n,now = 0;
int pr[maxn];
int main() {
for(int i=2;i<maxn;i++) {
if(pr[i] != 0) continue;
pr[i] = ++now;
for(long long j = 1ll*i*i;j<maxn;j+=i) {
pr[j] = now;
}
}
cin>>n;
for(int i=2;i<=n;i++) {
cout<<pr[i];
if( i!=n) cout<<' ';
else cout<<endl;
}
return 0;
}
D
先转化成 求一个符合条件的前缀异或和数组 , 由条件可知 这个数组 不能有相同的数,并且不存在两个数的异或和为 x, 因为 对于一个数 m, 只存在一个数 q 有 q^m = x ,所以我们保证这两个数不在不同一个集合里就能避免这个问题了.
AC_code
const int maxn = 1e5+7;
int n;
int vis[262150];
std::vector<int> v[2];
int main() {
int x;
cin>>n>>x;
int up = 1<<n;
for(int i = 1;i<up;i++) {
if( i == x) continue;
vis[i] = vis[ x ^ i] ^ 1;
v[vis[i]].push_back(i);
}
int ans = 1;
if(v[0].size()>v[1].size()) {
ans = 0;
}
int len = v[ans].size();
cout<<len<<endl;
sort(v[ans].begin(), v[ans].end());
for(int i =0;i<len;i++) {
if( i == 0) cout<< v[ans][i];
else cout<< (v[ans][i] ^ v[ans][i-1]);
if ( i != len -1) cout<<' ';
else cout<<endl;
}
return 0;
}