A.水题

题意:就是给你N个数,然后这些数的和跟乘积都不能为0,你能执行的操作为每次给数组中任意一个数加一,然后问最少你要执行多少次操作。

思路:不能出现零,出现零,乘积就为0了,所有有多少个零就得执行多少次。加上这些数后,如果sum正好等于0,那么需要在执行一次操作!

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int a[105];

int main()
{
	int t;
	cin >>t;
	while(t--)
	{
		int n;
		cin >>n;
		ll sum=0;
		int flag=0;
		for(int i=0;i<n;i++)
		{
			cin >>a[i];
			sum+=a[i];
			if(a[i]==0) flag++;
		}
		
		sum+=flag;
		
		if(sum==0) flag++;
		
		cout <<flag<<endl;
	}
}

B.
题意:就是给一组数据代表能力值不同的学生,你是校长,需要将他们分到两个班级,人数不一定要相等,求实力差最小是多少

题意:题目一开始就给提示了,我一开始没在意!

#include<bits/stdc++.h> 
using namespace std;

const int maxn = 2e5+5;

int a[maxn]; 

int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		for(int i=1;i<=2*n;i++){
			cin>>a[i];
		}
		sort(a+1,a+n*2+1);
		
		
		cout<<a[n+1]-a[n]<<endl;
	}
	
	return 0;
}

C
题意:Anu定义了一个函数如下:
f(x,y)=(x|y)−y
然后给一组数据,求怎么个顺序能使得到的得到的结果最大
A value of an array [a1,a2,…,an] is defined as f(f(…f(f(a1,a2),a3),…an−1),an)

WWWWW

#include <bits/stdc++.h>
#define maxn 100005 
using namespace std;
 
typedef long long ll;

ll a[maxn];
ll vis[50];

int main(){
    int n; 
    int ans;
    int mid;
    cin >> n;
    for(ll i=1;i<=n;i++){
        cin>>a[i];
        for (ll l=0;l<32;l++){
            if ((a[i] >> l) & 1)
                vis[l]++;
        }
    }
    for(ll i=1;i<=n;i++){
        ll flag = 0;
        for(ll l=0;l<32;l++){
            if(vis[l]==1&&((a[i]>>l)&1))
                flag=flag+(1ll << l);
            if(ans<flag)
                ans=flag,mid=i;
        }
    }
    swap(a[1],a[mid]);
    
    for (ll i=1;i<=n;i++)
        cout<<a[i]<<" ";
    return 0;
}