2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组真题

2024-03-05 1168阅读

温馨提示:这篇文章已超过384天没有更新,请注意相关的内容是否还可用!

2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组部分真题和题解分享

文章目录

  • 蓝桥杯2023年第十四届省赛真题-平方差
    • 思路题解
    • 蓝桥杯2023年第十四届省赛真题-更小的数
      • 思路题解
      • 蓝桥杯2023年第十四届省赛真题-颜色平衡树
        • 思路题解
        • 蓝桥杯2023年第十四届省赛真题-买瓜
          • 思路题解

            蓝桥杯2023年第十四届省赛真题-平方差

            题目描述

            给定 L, R,问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 x = y2 − z2。

            输入格式

            输入一行包含两个整数 L, R,用一个空格分隔。

            输出格式

            输出一行包含一个整数满足题目给定条件的 x 的数量。

            样例输入

            1 5

            样例输出

            4

            提示

            1 = 12 − 02 ;

            3 = 22 − 12 ;

            4 = 22 − 02 ;

            5 = 32 − 22 。

            对于 40% 的评测用例,LR ≤ 5000 ;

            对于所有评测用例,1 ≤ L ≤ R ≤ 109 。

            思路题解

            解题思路:

            • 规律:只有当x为奇数或4的倍数时才能拆分为两个数的平方差。

              注意事项:

            • 刚开始用c++写循环的时候,有一个样例会超时,故进一步寻找规律:F(X)=x/4+(x+1)/2,该式代表不大于x的满足条件的数的个数,用F®-F(L-1)即为L-R之间(大于等于L,小于等于R)满足条件的数的个数。
              #include
              using namespace std;
              int F(int x) {
                  return x / 4 + (x + 1) / 2;//不大于x的满足条件的数的个数
              }
              int main() {
                  int l = 0, r = 0;
                  cin >> l >> r;
                  cout  s[r]则满足条件,答案的个数+1。 
              

              详细解释:考虑s的所有子串[l,r], l即left,是子串的起始下标,r即right是子串的末尾下标,判断s[l] 和 s[r]的大小关系:

              • 若s[l] > s[r]则该子串反转后,新串原串,不满足条件。

                注意事项:

                • 注意l和r的取值范围(详见代码注释)。
                  #include
                  #include
                  using namespace std;
                  string s;
                  int F(int l, int r) {
                      while (l  s[r])return 1;//如果s[l] > s[r],反转后满足条件 新字符串 l++;r--; }//如果s[l] == s[r],两边同时缩小区间。
                          else break;//如果s[l]  s;
                      int n = s.length();//n是字符串长度
                      int ans = 0;//记录答案
                      for (int l = 0;l //l即left是子串的起始下标,从0开始到n-2(子串长度至少为2,最右侧的最小子串下标为[n-2,n-1],故l最多到n-2)
                          for (int r = n - 1;r  l;r--) {//r即right是子串的末尾下标,从s的最末下标n-1到l+1。
                              if(F(l,r))ans++;
                          }
                      }
                      cout 
                      for(auto entry:cnt_nb){
                          int c=entry.first,count = entry.second;
                          cnt[c] += count;
                      }
                  }
                  /*
                  对树进行dfs搜索,树的根节点为i,并返回该子树的各节点颜色计数结果
                  */
                  map
                      int sz = g[i].size();
                      map 
                          cnt[c[i]] = 1; 
                          ans++; 
                          return cnt;
                      }
                      /*如果不是叶子节点*/
                      //将根节点的颜色加入cnt
                      cnt[c[i]]=1;
                      //遍历根节点的所有子树,并将子树的计数结果累加到cnt中
                      for(int j=0;j
                          int nb = g[i][j];
                          map
                          //存在一种颜色数量不等,直接返回
                          if(entry.second != count) return cnt; 
                      }
                      //各颜色的数量相等,结果+1
                      ans++;
                      //返回计数结果
                      return cnt;
                  }
                  int main()
                  {
                      int n;
                      cinn;
                      vector g[N]; 
                      int c[N]; //每个节点的颜色
                      for(int i=0;i
                          int f;
                          cin>c[i]>>f;
                          if(f>=1){
                              g[f-1].push_back(i); //记录节点f的子节点i(节点编号从0开始)
                          }
                      }
                      dfs(g,c,0);
                      coutm 
                  

                  但是这样仍然会超时,还可以将重量数组降序排列,使得更快剪枝。还可以创建一个重量数组的后缀数组suf,这样在搜索时可以利用其剪枝:若当前重量加上剩余的所有瓜重量之和小于要求的重量,剪枝。

                  #include
                  #include
                  using namespace std;
                  const int N = 30; 
                  int INF = 100;
                  int n,m;
                  int v[N]; //重量数组
                  long suf[N+1]; //重量数组的后缀数组
                  int ans = INF; //将结果初始化为INF
                  /*
                  dfs搜索,参数分别表示当前层数,当前重量之和,切瓜的次数
                  */
                  void dfs(int pos,long sum,int cnt){
                      if(sum==m){ //找到了一个结果
                          ans = min(ans,cnt);
                          return;
                      }
                      //剪枝
                      if(pos>=n || cnt>=ans || sum>m || sum+suf[pos]
                      ios::sync_with_stdio(false);
                      cin.tie(0),cout.tie(0);
                      cin>n>>m;
                      m*=2; //总重量乘2
                      for(int i=0;i>v[i],v[i]*=2;
                      sort(v,v+n,greater());
                      for(int i=n-1;i>=0;i--) suf[i] = suf[i+1]+v[i];
                      dfs(0,0,0);
                      if(ans==INF) cout
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]