蓝桥杯真题——冶炼金属、飞机降落

目录

蓝桥杯2023年第十四届省赛真题-冶炼金属

题目描述

输入格式

输出格式

样例输入

样例输出

提示

代码1:使用技巧

代码2:使用二分查找最大最小,可代入模版

蓝桥杯2023年第十四届省赛真题-飞机降落 

题目描述

输入格式

输出格式

样例输入

样例输出

提示

思路:DFS+贪心

代码:


蓝桥杯2023年第十四届省赛真题-冶炼金属

题目描述

小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金

属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时,无法继续冶炼。

现在给出了 N 条冶炼记录,每条记录中包含两个整数 A 和 B,这表示本次投入了 A 个普通金属 O,最终冶炼出了 B 个特殊金属 X。每条记录都是独立

的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中。

根据这 N 条冶炼记录,请你推测出转换率 V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。

输入格式

第一行一个整数 N,表示冶炼记录的数目。

接下来输入 N 行,每行两个整数 A、B,含义如题目所述。

输出格式

输出两个整数,分别表示 V 可能的最小值和最大值,中间用空格分开。

样例输入

3
75 3
53 2
59 2

样例输出

20 25

提示

当 V = 20 时,有:⌊75/20⌋ = 3,⌊ 53/20 ⌋ = 2,⌊ 59/20 ⌋ = 2,可以看到符合所有冶炼记录。

当 V = 25 时,有:⌊75/25⌋ = 3,⌊ 53/25 ⌋ = 2,⌊ 59/25 ⌋ = 2,可以看到符合所有冶炼记录。

且再也找不到比 20 更小或者比 25 更大的符合条件的 V 值了。

对于 30% 的评测用例,1 ≤ N ≤ 102。

对于 60% 的评测用例,1 ≤ N ≤ 103。

对于 100% 的评测用例,1 ≤ N ≤ 104,1 ≤ B ≤ A ≤ 109。

代码1:使用技巧

#include
#include
#include
 
using namespace std;
 
int main()
{
	int n;
	cin>>n;
	int mi=0, mx=1e9;
	//设初始值与平常不同,即最大设一个小值,最小设一个最大值
	//应该根据具体情况而定 
	for(int i=0;i>a>>b;
		mx=min(mx,a/b);
		//满足条件的最大情况为a/b并且由于要每条记录都适用
		//!!求最大值时应该使用min进行比较 
		mi=max(mi,a/(b+1)+1);
		//当b变成b+1,即再造一个金属x时,转换率V=a/(b+1)。
		//此时为刚好不满足的情况
		//即因为a/(b+1)这个值是不能取到的,只能无限接近
		//又因为V是整数,加1就能保证是最小值
		//所以a/(b+1)+1为满足条件的最小情况
		//由于需要每条记录都适用,应该使用最小值中的最大一个 
	}
	cout<

代码2:使用二分查找最大最小,可代入模版

两个最值的分布情况

对于最大值来说,左边的都符合,所以是if(a[i]/x

蓝桥杯真题——冶炼金属、飞机降落_第1张图片

#include
#define int long long
using namespace std;

const int N=10000+10;
int n;
int a[N],b[N];
int ma,mi;

bool check1(int x)//最小值 
{
	for(int i=0;ib[i])
			return false;
	return true;
}
bool check2(int x)//最大值 
{
	for(int i=0;i>n;
	for(int i=0;i>a[i]>>b[i];
	int l=0,r=1e9;
	while(l

蓝桥杯2023年第十四届省赛真题-飞机降落 

题目描述

N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早

可以于 Ti 时刻开始降落,最晚可以于 Ti + Di 时刻开始降落。降落过程需要 Li个单位时间。

一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。

请你判断 N 架飞机是否可以全部安全降落。

输入格式

输入包含多组数据。

第一行包含一个整数 T,代表测试数据的组数。

对于每组数据,第一行包含一个整数 N。

以下 N 行,每行包含三个整数:Ti,Di 和 Li。

输出格式

对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。

样例输入

2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20

样例输出

YES
NO

提示

对于第一组数据,可以安排第 3 架飞机于 0 时刻开始降落,20 时刻完成降落。安排第 2 架飞机于 20 时刻开始降落,30 时刻完成降落。安排第 1 架飞机于 30 时刻开始降落,40 时刻完成降落。

对于第二组数据,无论如何安排,都会有飞机不能及时降落。

对于 30% 的数据,N ≤ 2。

对于 100% 的数据,1 ≤ T ≤ 10,1 ≤ N ≤ 10,0 ≤ Ti , Di , Li ≤ 105。

思路:DFS+贪心

DFS:找到一个排列,使得在该排列下,所有飞机能够安全降落

贪心:需要考虑下一架飞机的最早降落时间,飞机降落的时间越早越好,这样才能给后面的飞机留下更多容错

考虑下一架飞机的最早降落时间:dfs(num+1,max(t[i],sum)+l[i]);

如果到达时间小于上一架飞机降落时间,就要等到降落时间后再降落
如果到达时间大于上一架飞机降落时间,就直接降落  

代码:

#include
using namespace std;

const int N=20;

int T;
int n;
int t[N],d[N],l[N];
bool st[N];
bool flag;

void dfs(int num,int sum)
{
	if(num==n)
	{
		flag=1;
		return ;
	}
	for(int i=1;i<=n;i++)//遍历飞机 
	{
		if(!st[i]&&t[i]+d[i]>=sum)//没有访问过并且能降落 
		{
			st[i]=1;
			//考虑最早降落时间
			dfs(num+1,max(t[i],sum)+l[i]);
			st[i]=0;
		}
	}
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	cin>>T;
	while(T--)
	{
		//多组数据注意初始化数组和判断标志 
		memset(st,0,sizeof st);
		flag=0;
		cin>>n;
		for(int i=1;i<=n;i++)
			cin>>t[i]>>d[i]>>l[i];
		
		dfs(0,0);//降落飞机数,前一个飞机降落的时间
		if(flag) cout<<"YES"<

 

你可能感兴趣的:(蓝桥杯,职场和发展)