其他分享
首页 > 其他分享> > 蔚来杯2022牛客暑期多校训练营1

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

作者:互联网

Villages: Landlines

题意

一条数轴上有一个发电站和n个建筑物。现要建立一些电塔,并用电线将发电站,电塔,建筑物相连。其中发电站和建筑物不能直接相连,建筑物之间也不能直接相连。每个建筑物有一个坐标\(x_i\),以及一个半径\(r_i\)表示若在\([x_i-r_i,x_i+r_i]\)范围内有电塔可以不用电线直接相连。发电站也有相应的\(x_s,r_s\)。两个电塔可以用电线相连,若两个电塔的坐标分别位\(a,b\)则需电线|a-b|。求电线最少要多少。

数据范围

\(1<=n<=2e5,-1e9<=x_s,x_i<=1e9,1<=r_s,r_i<=1e9\)

思路

首先发电站和建筑物没有什么本质区别,都可以看作建筑物。

然后,没有规定电塔的数量。

按\(x_i-r_i\)排序,维护当前到达的最右端的位置R。能直接连就直接连,不能就拉电线。

(注:若按\(x_i\)排序不能处理1先与3连,3再与2连这种情况)

#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 2e5+10;
int n;
struct node{ int x , r; }s[N];
bool cmp(node &A , node &B) { return A.x - A.r < B.x - B.r; }
int main()
{
	scanf("%d" , &n);
	for(int i = 1 ; i <= n ; ++i) scanf("%d%d" , &s[i].x , &s[i].r);
	sort(s + 1 , s + 1 + n , cmp);
	//for(int i = 1 ; i <= n ; ++i) cout << s[i].x << ' ' << s[i].r << '\n';
	int R = s[1].x + s[1].r;
	long long res = 0;
	for(int i = 2 ; i <= n ; ++i)
		if(R >= s[i].x - s[i].r) R = max(R , s[i].x + s[i].r);
		else res += s[i].x - s[i].r - R , R = max(R , s[i].x + s[i].r);
	cout << res << '\n';	
	return 0;
}
/*
5
0 1
0 3
5 1
6 3
9 2
*/

Lexicographical Maximum

题意

给一个数n,求1~n中字典序最大的数。

数据范围

\(1<=n<=10^{1000000}\)

思路

若它前n-1位全是9,答案就是它本身,否则就是n-1个9.

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string a;
	cin >> a;
	int l = a.length() - 1;
	bool flag = false;
	for(int i = 0; i <= l - 1; i++)
	{
		if(a[i] != '9')
		{
			flag = true;
			break;
		}
	}
	if(flag)
	{
		for(int i = 0; i <= l - 1; i++)cout << "9";
	}
	else
	{
		cout << a;
	}
	return 0;
}

标签:电线,int,蔚来,建筑物,多校,发电站,牛客,电塔,include
来源: https://www.cnblogs.com/R-Q-R-Q/p/16537277.html