G-Lexicographical Maximum
题意提炼
给定一个整数n,输出1-n中字典序最大的数
思考分析
读入一个字符串 S ,长度为 len
当 S 的前 len-1 位都是 9 时输出 S 本身
否则输出 len-1 个 9 即可
AC代码
#include<iostream>
using namespace std;
int main()
{
//减少 cin cout的时间
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string S;
cin>>S;
int len=S.length();
bool flag=true;
if(len==1) //(特判) 当字符串长度为 1 时直接输出
{
cout<<S<<endl;
return 0;
}
for(int i=0;i<len-1;i++)
{
if(S[i]!='9')
{
flag=false;
break;
}
}
if(flag)
cout<<S<<endl;
else
for(int i=0;i<len-1;i++)
cout<<'9';
cout<<endl;
}
A-Villages:Landlines
原题梗概
在一维坐标上存在着 n 个建筑物,其中一个为发电站,剩余 n-1 个为用电建筑物 ,你可以建造一些电塔来联通发电站与建筑物。发电站与用电建筑物都有自己的接收范围,在该范围中建造电塔使该建筑物联入电力系统(无需电线),电塔之间的连接需要电线,当所有建筑物联入时,需要最短的电线长度。
题意提炼
给定 n 个区间,求区间之间的间隙和
输入格式
![](https://i-blog.csdnimg.cn/blog_migrate/70e880ad1e2f608ebe4fb8406af636cf.png)
思考分析
将所有区间按照左端点进行排序,维护一个最右边的端点,将所有左端点与该右端点比较
当左端点小于等于最右端点时:
说明两个区间是相交的,未产生间隙,不管,更新最右端点为更大的右端点
ed=max(ed,seg.second)
当左端点大于最右端点时:
说明两个区间产生了间隙,我们将间隙累加到答案中,更新最右端点
ans+=seg.first-ed
ed=seg.second
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef struct {
int st;
int ed;
}PII;
bool cmp(PII a,PII b)
{
return a.st<b.st;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,st,ed,ans=0,cen,rad;
cin>>n;
PII segs[n];
for(int i=0;i<n;i++)
{
cin>>cen>>rad;
segs[i].st=cen-rad;
segs[i].ed=cen+rad;
}
sort(segs,segs+n,cmp);
ed=segs[0].ed;
for(int i=1;i<n;i++)
{
if(segs[i].st<=ed)
ed=max(ed,segs[i].ed);
else
{
ans+=segs[i].st-ed;
ed=segs[i].ed;
}
}
cout<<ans<<endl;
}