签到题G A D
G.Lexicographical Maximum
题目大意与思路:
找到原字符串为基础的字典序最大的字符串,要字典序最大就尽可能让9在最前面,如果是len=1,就直接是原字符串,否则前len都是9也不变,否则结果是len-1个9
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int flag=1;
if(s.size()==1){
cout<<s;
return 0;
}
for(int i=0;i<(int)s.size()-1;i++){//只需要前面len-1位就好
if(s[i]!='9')flag=0;
}
if(flag)cout<<s;
else{
for(int i=0;i<(int)s.size()-1;i++)
cout<<9;
}
return 0;
}
A.Villages: Landlines
原题戳这里
题意:
• 数轴上有恰好一个发电站与 n − 1 个建筑物
• 在数轴上放置一些电力塔使得所有建筑物通过电力塔与发电站连通
• 能源站位于 xs,能与距离 rs 内的电力塔直接连通
• 第 i 个建筑物位于 xi,能与距离 ri 内的电力塔直接连通
• 可以消耗 |xA − xB| 长度的电线连通位于 xA 与 xB 的电力塔 • 最小化消耗的电线长度
思路:
区间合并,每个区间空隙就是答案的一部分
#include <iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int N=2e5+10;
struct point{
int x,r;
int L,R;
}p[N];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&p[i].x,&p[i].r);
p[i].R=p[i].x+p[i].r,p[i].L=p[i].x-p[i].r;
}
sort(p+1,p+n+1,[](point a,point b){return a.L<b.L;});
ll ans=0;
int end=p[1].R;
for(int i=2;i<=n;i++){
if(p[i].L>end){
ans+=(p[i].L-end);
end=p[i].R;
}
else
if(end<p[i].R)end=p[i].R;
}
printf("%lld\n",ans);
return 0;
}
D.Mocha and Railgun
原题戳这里
题意:
• 给定一个圆和严格位于圆内的一点 P
• Mocha 会从点 P 向任意角度发射一个长度为 2d 的电磁炮 • 电磁炮底边的中点为点 P 且两端位于圆内
• 询问单次发射能摧毁的最大圆弧长
题解搬运工了QAQ
#include <iostream>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N=2e5+10;
int main()
{
int T;
scanf("%d",&T);
while(T--){
double r,x,y,d;
scanf("%lf %lf %lf %lf",&r,&x,&y,&d);
double L=sqrt(x*x+y*y);
printf("%.10lf\n",r*(asin((L+d)/r)-asin((L-d)/r)));
}
return 0;
}