赞
踩
蓝桥杯2023年第十四届省赛真题-飞机降落 - C语言网 (dotcpp.com)
可以参考的视频:
[蓝桥杯]真题讲解:飞机降落(DFS枚举)_哔哩哔哩_bilibili
需要注意的地方:
1.因为个人在回溯的时候喜欢用全局变量,而不是传递参数,所以特别注意多组数据测试时,每次开始都要记得把所有变量重新初始化 。
2.多组数据输出的时候,要注意输出格式,比如换行符和空格。
3.对于数据规模很小的题目,暴力枚举、dfs即可。
4.这道题要特殊注意的是,不一定下一架飞机就是在上架飞机刚好降落结束的时候降落,有可能下一架飞机的最早开始降落时间都大于这个时间,所以需要从 下一架飞机的最早开始降落时间 和 当前时间(上架飞机刚好降落完的时候)取出较大者作为下一架的降落开始时间。
5.在计算时间的时候,考虑到的是每架要降落的飞机都要尽早地开始降落,因为DFS一个分支其实是相当于定好了顺序,如果不尽早地降落,那段时间也就被白白地浪费了,后面的飞机降落的时间就少了。
- //#include<iostream>
- #include<bits/stdc++.h>
- #define int long long
- const int N=1e6+10;
- using namespace std;
- int cnt=0;
- int T[12],L[12],D[12];
- int v[12];
- int sumtime=0;
- bool flag=false;
- void dfs(int n){
- if(cnt==n){
- //所有飞机都降落,标志设为true
- flag=true;
- return;
- }
- for(int i=0;i<n;i++){
- //已经降落的飞机 跳过
- if(v[i]) continue;
- //该飞机最晚降落开始时间小于当前时间 这架肯定不能及时降落,直接结束这次循环
- if((T[i]+D[i]<sumtime)) break;
- //保存此时的时间
- int current=sumtime;
- //因为可能此时时间比飞机最早开始降落时要小,就不是在此时刻马上就有一个飞机降落,所以要进行分类
- if(sumtime>T[i]) sumtime+=L[i];
- else sumtime=T[i]+L[i];
- v[i]=1;
- cnt++;
-
- dfs(n);
-
- if(flag) break;
-
- //恢复现场
- cnt--;
- sumtime-=L[i];
- if(sumtime!=current) sumtime=current;
- v[i]=0;
- }
- }
- signed main() {
-
- int t;
- cin>>t;
- while(t--){
- //每次开始都要记得把所有变量初始化
- flag=false;
- int n=0;cnt=0;sumtime=0;
- cin>>n;
- for(int i=0;i<n;i++){
- cin>>T[i]>>D[i]>>L[i];
- //每次开始都要记得把所有变量初始化
- v[i]=0;
- }
-
- dfs(n);
-
- if(flag) cout<<"YES"<<endl;
- else cout<<"NO"<<endl;
-
- }
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。