2022牛客多校第一场
A Villages:Landlines
题意:
在一维坐标上存在着 n 个建筑物,其中一个为发电站,剩余 n-1 个为用电建筑物 ,你可以建造一些电塔来联通发电站与建筑物。发电站与用电建筑物都有自己的接收范围,在该范围中建造电塔使该建筑物联入电力系统(无需电线),电塔之间的连接需要电线,当所有建筑物联入时,需要最短的电线长度。
思路:
将接受范围看作区间,区间出现交集则不需要加电线。将区间排序后,将所有区间连通,注意更新区间右端。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int n;
ll x,y,ans,zo,yo;
struct node {
ll l,r;
}s[N];
bool cmp(node a,node b){
if(a.l!=b.l) return a.l<b.l;
else return a.r>b.r;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>x>>y;
s[i].l=x-y;
s[i].r=x+y;
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++){
if(i==0){
yo=s[i].r;
}
else {
if(s[i].l>yo) {
ans+=s[i].l-yo;
yo=s[i].r;
}
else yo=max(yo,s[i].r);
}
}
cout<<ans<<endl;
}
G Lexicographical Maximum
题意:
求1 ∼ n 中字典序最大的数。
思路: 让构造出的数中9尽可能的多,同时考虑特例一位的话就是本身,全为9也是本身。
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int len=s.size();
if(len==1){
cout<<s;
return 0;
}
int f=0;
string ss="";
for(int i=0;i<len-1;i++){
cout<<"9";
if(s[i]!='9') f=1;
}
if(f==0) cout<<s[len-1];
return 0;
}
D Mocha and Railgun
题意:
题意:给你一个中心为(0,0)半径为r的圆,你有一个长度为2d的线段,你可以让其绕中心(x,y)旋转,让其左侧的圆弧在其的射影的弧长最大,求弧长。
思路:
让线段旋转延申成穿过圆心时,投影的弧长最大。剩下就是推公式了。
多组输出,最后输出要注意换行!
代码:
using namespace std;
typedef long long ll;
inline void solve(){
double r,x,y,d;
scanf("%lf%lf%lf%lf",&r,&x,&y,&d);
double h=sqrt(x*x+y*y);
printf("%.10lf\n",r*(asin((d+h)/r)-asin((h-d)/r)));
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;
scanf("%d",&t);
while(t--){
solve();
}
return 0;
}