A. Draw a Square

题意:

给你四个位于坐标轴上的点,判断是否能构成正方形

思路:

简单的模拟

显然,必须四个点到原点的距离都相等且夹角为90°,矩形虽满足,但夹角不是90°,菱形虽夹角90°,但四个点到原点的距离不相等

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve(){
	int a,b,c,d;
	cin>>a>>b>>c>>d;
	if(a==b&&b==c&&c==d){
		cout<<"YES"<<endl;
	}else{
		cout<<"NO"<<endl;
	}
	
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t;
	cin>>t;
//	t=1;
	while(t--)solve();
	return 0;
}

B. The Third Side

题意:

有一个含n个元素的数组,每次选择任意两个元素i,j,找一个能与i,j形成三角形的数x,删除i,j,将x加到数组的后面,使最后数组唯一元素最大

思路:

简单的贪婪

只需使每次选择的x最大,选两个元素,x=i+j-1,即可满足

可通过数组和减(数组元素数量减一)实现

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve(){
	int n;
	cin>>n;
	vector<int>v(n);
	int sum=0;
	for(int i=0;i<n;i++){
		cin>>v[i];
		sum+=v[i];
	}
	cout<<sum-(n-1)<<endl;
	
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t;
	cin>>t;
//	t=1;
	while(t--)solve();
	return 0;
}

C. XOR and Triangle

题意:

每次给你一个整数x,找是否存在一个整数y(y<x),使x,y,x^y构成一个三角形

思路:

一个暴力会超时的思路,每次遍历1~x-1,找是否存在

所以,我们应从掩码的角度思考

首先,x的二进制首位一定是1,所以想让y<x只需让y的二进制首位为0,那其他位都为1最优,

因为:

如x=2-->10,y只能等于1-->01,x^y=11-->3,显然无法构成,

当x位是0时,y位是1||0均有可能,x位是1时,y位是1有可能,是0时,只会导致x+y==x^y

因此,我们只需使y的二进制首位为0,那其他位都为1就是最优

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve(){
	int x;
	cin>>x;
	int b=x;
	vector<int>x01,y01;
	while(x){
		x01.push_back(x%2);
		x/=2;
	}
	int sum=0;
	for(int i=0;i<x01.size()-1;i++){
		sum+=pow(2,i);
	}
	int a=sum^b;
	if(a+b>sum&&a+sum>b&&b+sum>a){
		cout<<sum<<endl;
	}else{
		cout<<-1<<endl;
	}
	
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t;
	cin>>t;
//	t=1;
	while(t--)solve();
	return 0;
}

D. Counting Points

题意:

有n个圈,其半径和m,给出每个圆的圆心,半径,找所有被包含的点

思路:

如果一个圆一个圆的算,你会发现,圆与圆之间有包含,相切,相离,相交,情况十分复杂,所以,我们一个点一个点的算

每个圆包含点数由于有其他圆影响,不好算,但由于每个圆圆心在x轴,其x上的每一个点容易枚举,根据圆的方程公式,可求出每个点的上下y值,每次枚举经过一个点,大的圆一定覆盖小的圆,用map记录更新即可

用到map遍历

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve(){
	int n,m;
	cin>>n>>m;
	vector<int>p(n),r(n);
	for(int i=0;i<n;i++)cin>>p[i];
	for(int i=0;i<n;i++)cin>>r[i];
	map<int,int>mp;
	for(int i=0;i<n;i++){
		for(int j=p[i]-r[i];j<=p[i]+r[i];j++){
			mp[j]=max(mp[j],2*(int)sqrt(r[i]*r[i]-(p[i]-j)*(p[i]-j))+1);
		}
	}
	int sum=0;
	for(auto [a,b]:mp)sum+=b;
	cout<<sum<<endl;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t;
	cin>>t;
//	t=1;
	while(t--)solve();
	return 0;
}

Logo

集算法之大成!助力oier实现梦想!

更多推荐