当前位置:   article > 正文

2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组_2023蓝桥杯b组真题c语言

2023蓝桥杯b组真题c语言

 直接枚举每一天

  1. #include<iostream>
  2. using namespace std;
  3. int a[110],n;
  4. int d[]={-1,31,28,31,30,31,30,31,31,30,31,30,31};//d[i]表示第i个月的天数
  5. bool check(int x)
  6. {
  7. int y=10000000;
  8. for(int i=1;y>=1;i++)
  9. {
  10. int t=x/y%10; //把x各位从头到尾逐个取出
  11. while(i<=n&&a[i]!=t)i++;
  12. if(a[i]!=t||i>n)return false;
  13. y/=10;
  14. }
  15. return true;
  16. }
  17. int main()
  18. {
  19. n=100;
  20. for(int i=1;i<=n;i++)cin>>a[i];
  21. int ans=0;
  22. for(int i=1;i<=12;i++)
  23. for(int j=1;j<=d[i];j++)
  24. if(check(20230000+i*100+j))ans++;
  25. cout<<ans;
  26. return 0;
  27. }

输出结果为235

 设0出现次数为a,1出现的次数为b,则H(s)=-a*p(0)*log(p(0))-b*p(1)*log(p(1))

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int main()
  5. {
  6. int n=23333333;
  7. for(int a=0;a<=n;a++)
  8. {
  9. int b=n-a;
  10. double pa=a*1./n,pb=b*1./n;
  11. double hs=-a*pa*log2(pa)-b*pb*log2(pb);
  12. if(11625907.5798-hs<1e-4)
  13. {
  14. cout<<a<<' '<<b;
  15. break;
  16. }
  17. }
  18. return 0;
  19. }

输出结果为  11027421 12305912  验算发现结果正确,根据题意选小的

 观察发现对于单独每组数据,V在  A   /  ceil(A/(B+1))  ~  floor(A/B)  之间

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int main()
  5. {
  6. int _;
  7. cin>>_;
  8. int maxv=1e9,minv=0;
  9. while(_--)
  10. {
  11. int A,B;
  12. cin>>A>>B;
  13. maxv=min(maxv,A/B);
  14. minv=max(minv,(int)ceil(A*1./(B+1)));
  15. }
  16. cout<<minv<<' '<<maxv;
  17. return 0;
  18. }

 我的思路是直接暴力全排列,时间复杂度最多是10*10*10!约等于3.6*10^8可以满足

全排列后得到所有飞机降落顺序,原则是尽量更早降落,如果发现当前飞机最晚可以开始降落的时间比上一架飞机完成降落时间还早说明该排列不能作为解。只要找到一个解就yes,否则no

  1. #include<iostream>
  2. using namespace std;
  3. const int N=11;
  4. int t[N],d[N],l[N];
  5. int n,a[N];//a存储飞机顺序
  6. bool flag,st[N];
  7. bool check()
  8. {
  9. for(int x=0,i=1;i<=n;i++)//x表示上一架飞机完成降落的时间
  10. {
  11. if(t[a[i]]+d[a[i]]<x)return false;
  12. if(x<t[a[i]])x=t[a[i]]+l[a[i]];//上一架飞机完成降落时当前飞机还没到
  13. else x+=l[a[i]];
  14. }
  15. return true;
  16. }
  17. void dfs(int u)
  18. {
  19. if(u>n)
  20. {
  21. if(check())flag=1;
  22. return ;
  23. }
  24. for(int i=1;i<=n;i++)
  25. if(!st[i])
  26. {
  27. st[i]=true;
  28. a[u]=i;
  29. dfs(u+1);
  30. st[i]=false;
  31. }
  32. }
  33. int main()
  34. {
  35. int _;
  36. cin>>_;
  37. while(_--)
  38. {
  39. flag=0;
  40. cin>>n;
  41. for(int i=1;i<=n;i++)st[i]=false;
  42. for(int i=1;i<=n;i++)cin>>t[i]>>d[i]>>l[i];
  43. dfs(1);
  44. puts(flag?"YES":"NO");
  45. }
  46. return 0;
  47. }

 

         dp。用f[i]表示接龙序列的结尾数字的最后一位是 i的最长序列长度。

  1. #include<iostream>
  2. using namespace std;
  3. int f[11];
  4. int getHead(int x)
  5. {
  6. while(x>=10)x/=10;
  7. return x;
  8. }
  9. int main()
  10. {
  11. int n;
  12. cin>>n;
  13. for(int i=1;i<=n;i++)
  14. {
  15. int x;
  16. cin>>x;
  17. int tail=x%10,head=getHead(x);
  18. f[tail]=max(f[tail],f[head]+1);
  19. }
  20. int ans=n-1;
  21. for(int i=0;i<=9;i++)ans=min(ans,n-f[i]);
  22. cout<<ans;
  23. return 0;
  24. }

暂时先这么多,答案可能有错,有发现可以一起交流指正!!!

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

闽ICP备14008679号