(补题)Codeforces Round 1009 (Div. 3)(A~D)
·
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;
}
更多推荐



所有评论(0)