A. Non-zero
题意:
给你一个数组,然后每次你可以执行一个操作,这个操作可以使数组中任意一个数 +1;然后求出来至少执行多少次操作才可以使这个数组的乘积还有数组的和都不为0;
思路:
统计出来0的个数,就是满足乘积不为0的需要操作数;然后算出来数组的和+之前操作数看是否等于0,如果等于0就证明还需要再操作一次;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200];
int main()
{
int t;
cin >>t;
while(t--)
{
int n;
cin >>n;
ll sum=0;
int cot=0;
for(int i=0;i<n;i++)
{
cin >>a[i];
sum+=a[i];
if(a[i]==0) cot++;
}
sum+=cot;
if(sum==0) cot++;
cout <<cot<<endl;
}
}
.
.
B - Assigning to Classes
题意:
2n个学生分成两个班,求两个班的中位数差值,然后求这个差值的最小值;
思路:
其中一个分法为:把全部学生乘积从小到大排序后,依次分给两个班;
此时中位数的差值就是整体数组的a [ n ] - a [ n +1 ]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200005];
bool cmp(int a,int b)
{
return a>=b;
}
int main()
{
int t;
cin >>t;
while(t--)
{
int n;
cin >>n;
for(int i=0;i<2*n;i++)
{
cin >>a[i];
}
sort(a,a+2*n);
cout <<abs(a[n-1]-a[n])<<endl;
}
}
.
.
.
C - Anu Has a Function
题意:
给你一个数组,要求对这个数组排序,使得 f(f(…f(f(a1,a2),a3),…an−1),an)最大;
f(x,y)=x|y-y
思路:
先看 f(x,y)=x|y-y,改变思维,找二进制的规律,在二进制里面有以下几种情况:
f(1,0)=1; f(1,1)=0;f(0,1)=0;f(0,0)=0;
只有一种情况下总体的答案的二进制的某一位才为1:f(1,0)=1;
所以,把每个数二进制分解,然后从二进制的最高位向最低位寻找,如果在这个位置只有一个数的为1,那么这个数就放第一个,其他的随便排序就行;
.
#include <bits/stdc++.h>
using namespace std;
int dig[100005][50];
int a[100005];
int fg[100005];
int main()
{
int n;
cin >>n;
for(int i=0;i<n;i++)
{
cin >>a[i];
for(int j=0;j<=31;j++)
{
dig[i][j]=(a[i]>>j)&1;
}
}
for(int j=31;j>=0;j--)
{
int sum=0,cnt=0;
for(int i=0;i<n;i++)
{
if(dig[i][j])
{
sum++;
cnt=i;
}
}
if(sum==1&&!fg[cnt]) cout <<a[cnt]<<" ",fg[cnt]=1;
}
for(int i=0;i<n;i++)
{
if(!fg[i]) cout <<a[i]<<" ";
}
}
.
.
.
D - Aerodynamic
题意:
题意很长,就是给一个多边形P,然后P在原点附近平移(保证原点在P的内部或者边上),然后P移动的区域是多边形T,然后问P和T是否相似?
思路:
只有当P的顶点个数是偶数并且P是中心对称图形时才满足题意;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+7;
struct node
{
double x,y;
}bb[N];
int main()
{
int n;
cin >>n;
for(int i=1;i<=n;i++)
{
cin >>bb[i].x>>bb[i].y;
}
int flag=1;
if(n%2==1)
{
flag=0;
}
else
{
int j=n/2;
double x=(bb[1].x+bb[1+j].x)/2,y=(bb[1].y+bb[1+j].y)/2;
for(int i=2;i<=n/2;i++)
{
if((bb[i].x+bb[i+j].x)/2!=x||(bb[i].y+bb[i+j].y)/2!=y)
{
flag=0;
break;
}
}
}
if(flag) cout <<"YES"<<endl;
else cout <<"NO"<<endl;
}