蔚来杯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