Codeforces Round #618 (Div. 2)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值