“蔚来杯“2022牛客暑期多校训练营1

Fly

G.Lexicographical Maximum

题意:

给出一个数字n(n可能会很大),求出1-n之间字典序最大的数字。

思路:

要实现字典序最大,那么肯定以9开头。 先考虑特殊情况,只有一位数字时,那么肯定就是n。
否则,设数字n的位数为len,那么先是len-1位的9,再看如果数字n的前n-1位都是9,那么最后再加上n的最后一位,就是字典序最大的,就是n。如果不是,那么就输出n-1位的9。
因为n可能很大,所以以字符串形式输入。

考察:
字典序最大

代码:

#include 
using namespace std;
int main(){
	string s;
	cin>>s;
	int len=s.size();
	if(len==1){
		cout<

A.Villages: Landlines

题意:

给出一个发电站和多个建筑物的一维坐标,需要通过电塔和电线将它们全部连接起来,实现所用电线长度最短。在发电站/建筑物半径范围内可以直接与电塔相连,电塔与电塔之间通过电线相连。

思路:

将每个坐标及半径转化为区间,将相交的区间进行合并(按左端点对区间进行排序,从左到右依次合并,这样得到的大区间之间一定不会相交),最后要实现相连,就是每个大区间之间的距离相加。如果最后合并得到的只有一个区间,那么所用电线长度为0.

考察:
区间合并

Notice:

因为r范围位-1e9~1e9,所以要边界要比2e9要大,我用的是3e9,并且用了long long。最开始错误是因为在从左到右只考虑了右端点,而不是考虑的区间,因此容易出现当后面的覆盖前面时造成所求距离缩短的情况。因此需要先实现区间的合并,再求大区间之间的距离。

代码:

#include 
using namespace std;
typedef long long ll;
typedef pair PII;
vector p,q;
struct node{
	ll x,r;
}a[200005];

inline void solve(){
   ll n;
   scanf("%lld",&n);
   for(ll i=0;i

区间合并模板:

 sort(p.begin(),p.end());//按左端点排序
   
   ll st=-3e9,ed=-3e9;//设置初始边界
   for(auto num:p)                   
    {
        if(ed

D.Mocha and Railgun

题意:
给出一个圆心为C(0,0)的圆墙,一个点Q(x,y)和d,Q为线段AB的中心,线段的长度为2d。求能够映射的弧的最长长度。线段AB端点严格在圆墙内。

思路:
在弧度制下,若弧所对的圆心角为θ,则有公式l=Rθ。
r
sinθ=L+d
θ=arcsin((L+d)/r)
“蔚来杯“2022牛客暑期多校训练营1_第1张图片

考察:
平面计算几何

代码:

#include 
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;
}

你可能感兴趣的:(比赛,c++,算法)