2022 • 牛客暑期多校训练营 第一场题解


题目列表

 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 个区间,求区间之间的间隙和

输入格式

思考分析

将所有区间按照左端点进行排序,维护一个最右边的端点,将所有左端点与该右端点比较

当左端点小于等于最右端点时:

说明两个区间是相交的,未产生间隙,不管,更新最右端点为更大的右端点

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值