当前位置:   article > 正文

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

蓝桥杯真题飞机

题目链接:

蓝桥杯2023年第十四届省赛真题-飞机降落 - C语言网 (dotcpp.com)

可以参考的视频:

[蓝桥杯]真题讲解:飞机降落(DFS枚举)_哔哩哔哩_bilibili 

说明 :

需要注意的地方:

1.因为个人在回溯的时候喜欢用全局变量,而不是传递参数,所以特别注意多组数据测试时,每次开始都要记得把所有变量重新初始化

2.多组数据输出的时候,要注意输出格式,比如换行符和空格。

3.对于数据规模很小的题目,暴力枚举、dfs即可。

4.这道题要特殊注意的是,不一定下一架飞机就是在上架飞机刚好降落结束的时候降落,有可能下一架飞机的最早开始降落时间都大于这个时间,所以需要从 下一架飞机的最早开始降落时间 和 当前时间(上架飞机刚好降落完的时候)取出较大者作为下一架的降落开始时间。

5.在计算时间的时候,考虑到的是每架要降落的飞机都要尽早地开始降落,因为DFS一个分支其实是相当于定好了顺序,如果不尽早地降落,那段时间也就被白白地浪费了,后面的飞机降落的时间就少了。

代码:

  1. //#include<iostream>
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. const int N=1e6+10;
  5. using namespace std;
  6. int cnt=0;
  7. int T[12],L[12],D[12];
  8. int v[12];
  9. int sumtime=0;
  10. bool flag=false;
  11. void dfs(int n){
  12. if(cnt==n){
  13. //所有飞机都降落,标志设为true
  14. flag=true;
  15. return;
  16. }
  17. for(int i=0;i<n;i++){
  18. //已经降落的飞机 跳过
  19. if(v[i]) continue;
  20. //该飞机最晚降落开始时间小于当前时间 这架肯定不能及时降落,直接结束这次循环
  21. if((T[i]+D[i]<sumtime)) break;
  22. //保存此时的时间
  23. int current=sumtime;
  24. //因为可能此时时间比飞机最早开始降落时要小,就不是在此时刻马上就有一个飞机降落,所以要进行分类
  25. if(sumtime>T[i]) sumtime+=L[i];
  26. else sumtime=T[i]+L[i];
  27. v[i]=1;
  28. cnt++;
  29. dfs(n);
  30. if(flag) break;
  31. //恢复现场
  32. cnt--;
  33. sumtime-=L[i];
  34. if(sumtime!=current) sumtime=current;
  35. v[i]=0;
  36. }
  37. }
  38. signed main() {
  39. int t;
  40. cin>>t;
  41. while(t--){
  42. //每次开始都要记得把所有变量初始化
  43. flag=false;
  44. int n=0;cnt=0;sumtime=0;
  45. cin>>n;
  46. for(int i=0;i<n;i++){
  47. cin>>T[i]>>D[i]>>L[i];
  48. //每次开始都要记得把所有变量初始化
  49. v[i]=0;
  50. }
  51. dfs(n);
  52. if(flag) cout<<"YES"<<endl;
  53. else cout<<"NO"<<endl;
  54. }
  55. return 0;
  56. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/436235
推荐阅读
相关标签
  

闽ICP备14008679号