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;
}