A题
题目链接
题意及思路
- 题意:给定两个正整数数组,从两数组中分别挑选一个出来,使得两数之和不属于定两数组。
- 思路:sort一下,然后取两数组的最大值即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
int a[N],b[N];
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
cin >> m;
for(int i=0;i<m;i++) cin >> b[i];
sort(a,a+n);
sort(b,b+m);
cout << a[n-1] << " " << b[m-1] << endl;
return 0;
}
B题
题目链接
题意及思路
- 题意:使得给定一串数的乘积为1,只可以对某数进行+1、-1操作,很好的是可以无限次对一个数进行操作,求最少操作次数。(给定的数都为整数)
- 思路:直接的想法是,开三个数组,分别正数、负数和0(当然0可以只计数)。考虑三种情况,第一种情况是负数能够自给自足(即负数是偶数,乘积为正数),或者含有0(这样可以补负数,即0-1=-1,如果还有0就可以变成1)。第二种情况是,在前面情况不满足的情况下,含有正数。第三种情况是,在不满足前面的情况下,即只有负数且负数不成对。后面两种情况,可以自己想想,实现见代码。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int pn=0,zn=0,nn=0;
int pos[N],zero[N],nag[N];
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
int n,x;
cin >> n;
for(int i=0;i<n;i++){
cin >> x;
if(x>0) pos[pn++] = x;
else if(x<0) nag[nn++] = x;
else zero[zn++] = x;
}
long long ans = 0;
if(nn%2==0 || zn>0){
for(int i=0;i<pn;i++) ans += (pos[i]-1);
for(int i=0;i<nn;i++) ans += (-1-nag[i]);
ans += zn;
}else if(pn>0){
sort(pos,pos+pn);
ans += (pos[0]+1);
for(int i=1;i<pn;i++) ans += (pos[i]-1);
for(int i=0;i<nn;i++) ans += (-1-nag[i]);
}else{
sort(nag,nag+nn);
ans += (1-nag[0]);
for(int i=1;i<nn;i++) ans += (-1-nag[i]);
}
cout << ans << endl;
return 0;
}
C题
题目链接
题意及思路
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int q[N];
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
int n,cnt=0;
cin >> n;
if(n%2!=0){
cout << "YES" << endl;
int val = 1,idx = 0;
q[idx] = val++; cnt++;
while(cnt<=2*n){
idx = (idx+n)%(2*n);
q[idx] = val++;
if(val>2*n) break;
idx = (idx+1)%(2*n);
q[idx] = val++;
cnt += 2;
}
for(int i=0;i<2*n;i++){
cout << q[i];
if(i!=2*n-1) cout << " ";
}
cout << endl;
}else cout << "NO" << endl;
return 0;
}