【第十届蓝桥杯真题】【省赛】【C++B组】【学习笔记】蓝桥杯每日一练day5

🤗🤗🤗🤗🤗🤗🤗,今天也是麻麻的一天捏

A、组队(5分)

组队 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述
在这里插入图片描述

一眼看出,有点水

#include<iostream>
using namespace std;
int main()
{
    cout<<98 + 99 + 98 + 97 + 98 << endl;
	return 0;
}
// 490

B、年号字串(5分)

年号字串 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

有一点水,原来是指测试数据水,我这样写连Z都判不出来,但是还是能过捏🤗🤗

#include <iostream>
#include<algorithm>
using namespace std;
const int N = 500;
int a[N];
int main()
{
  int num = 2019;
  int cnt = 0;
  while(num)
  {
    a[cnt++] = num % 26;
    num /= 26;
  }
  reverse(a,a + cnt);
  for(int i = 0 ; i < cnt ; i++)
    if(a[i] == 0) printf("Z");
    else printf("%c",a[i] + 'A' - 1);
  return 0;
}

C、 数列求值(10分)

数列求值 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

暴力不动了,我们只考虑后四位

#include <iostream>
using namespace std;
typedef long long LL;

int main()
{
  int n = 20190324;
  int a = 1 ,b = 1 ,c = 1 , d = 0;
  for(int i = 4 ; i <= n ; i++)
  {
    d = (a + b + c) % 10000;
    a = b;
    b = c;
    c = d;
  }
  cout<<d<<endl;
  return 0;
}

D、数的分解(10分)

数的分解 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
  int n = 2019;
  int res = 0;
  for(int i = 1 ; i <= n ; i++)
    for(int j = i + 1 ; j < n ; j++)
    {
      int k = n - i - j;
      string a = to_string(i);
      string b = to_string(j);
      string c = to_string(k);
      if(a.find("2") == -1 && a.find("4") == -1 
      && b.find("2") == -1 && b.find("4") == -1 
      && c.find("2") == -1 && c.find("4") == -1 )
        if(j < k)
          res++;
    }
  cout<<res<<endl;
  return 0;
}

E、迷宫(15分)

在这里插入图片描述

01010101001011001001010110010110100100001000101010 
00001000100000101010010000100000001001100110100101 
01111011010010001000001101001011100011000000010000 
01000000001010100011010000101000001010101011001011 
00011111000000101000010010100010100000101100000000 
11001000110101000010101100011010011010101011110111 
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010 
00111000001010100001100010000001000101001100001001 
11000110100001110010001001010101010101010001101000 
00010000100100000101001010101110100010101010000101 
11100100101001001000010000010101010100100100010100 
00000010000000101011001111010001100000101010100011 
10101010011100001000011000010110011110110100001000 
10101010100001101010100101000010100000111011101001 
10000000101100010000101100101101001011100000000100 
10101001000000010100100001000100000100011110101001 
00101001010101101001010100011010101101110000110101 
11001010000100001100000010100101000001000111000010 
00001000110000110101101000000100101001001000011101 
10100101000101000000001110110010110101101010100001 
00101000010000110101010000100010001001000100010101 
10100001000110010001000010101001010101011111010010 
00000100101000000110010100101001000001000000000010 
11010000001001110111001001000011101001011011101000 
00000110100010001000100000001000011101000000110011 
10101000101000100010001111100010101001010000001000 
10000010100101001010110000000100101010001011101000 
00111100001000010000000110111000000001000000001011 
10000001100111010111010001000110111010101101111000

F、特别数的和(15分)

特别数的和 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

【输入样例】

40

【输出样例】

574

【数据范围】

对于 20% 的评测用例 : 1 ≤ n ≤ 10 {1 \le n \le 10} 1n10

对于 50% 的评测用例 : 1 ≤ n ≤ 100 {1 \le n \le 100} 1n100

对于 80% 的评测用例 : 1 ≤ n ≤ 1000 {1 \le n \le 1000} 1n1000

对于所有的评测用例 : 1 ≤ n ≤ 10000 {1 \le n \le 10000} 1n10000

语法基础题,不做评价
#include <iostream>
using namespace std;
typedef long long LL;
int main()
{
  int n;
  cin>>n;
  LL res = 0;
  for(int i = 1 ; i <= n ; i++)
  {
    string a = to_string(i);
    if(a.find("2") != -1 || a.find("0") != -1 || a.find("1") != -1 || a.find("9") != -1)
      res += i;
  }
  cout<<res<<endl;
  return 0;
}

G、完全二叉树的权值(20分)

完全二叉树的权值 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

​ 输出一个整数代表答案

【输入样例】

7
1 6 5 4 3 2 1

【输出样例】

2

【数据范围】

​ 对于所有的评测用例 : 1 ≤ N ≤ 100000 {1 \le N \le 100000} 1N100000 − 100000 ≤ A i ≤ 100000 {-100000\le A_i \le 100000} 100000Ai100000

我们不难发现,完全二叉树的层数和节点,都是2的倍数

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main()
{
  int n;
  cin>>n;
  int maxSum = -1e7;
  int res = 0;
  for(int i = 1 ; i <= n ; i++) cin>>a[i];
  for(int i = 1 ; 1 << (i - 1) < n ; i++)
  {
    int t = 0;    // 用于记录这一层各个节点的和
    for(int j = 1 << (i - 1) ; j < (1 << i) && j < n ; j++)
      t += a[j];
    if(t > maxSum)
    {
      maxSum = t;
      res = i;
    }
  }
  cout<<res<<endl;
  return 0;
}

H、等差数列(20分)

等差数列 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

【输入样例】

5
2 6 4 10 20

【输出样例】

10

【样例说明】

包含2、6、4、10、20的最短等差数列是 2、4、6、8、10、12、14、16、18、20

【数据范围】

​ 对于所有评测用例, 2 ≤ N ≤ 100000 {2 \le N \le 100000} 2N100000 0 ≤ A i ≤ 1 0 9 {0 \le A_i \le 10^9} 0Ai109

相邻的两个数,必然是公差的倍数

求等差数列的个数: a 末 − a 首 b + 1 { \frac{a_末 - a_首}{b}} + 1 baa+1

每一项与第一项的差一定是d的倍数
#include <iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;
int gcd(int a,int b)
{
  return b ? gcd(b , a % b) : a;
}
int main()
{
  cin >> n;
  for(int i = 0 ; i < n ; i++) cin >> a[i];
  sort(a, a + n);
  int d = 0;
  for(int i = 1 ;  i < n ; i++) d = gcd(d,a[i] - a[0]);
  if(d == 0) cout << n << endl;
  else cout << (a[n-1] - a[0]) / d + 1 << endl;
  return 0; 
}

I、 后缀表达式(25分)

在这里插入图片描述

【输入样例】

1 1
1 2 3

【输出样例】

4

【数据范围】

0 ≤ N , M ≤ 100000 {0 \le N,M \le 100000} 0N,M100000 − 1 0 9 ≤ A i ≤ 1 0 9 {-10^9 \le A_i \le 10^9} 109Ai109

开摆1下🤗

J、灵能传动(25分)

在这里插入图片描述

【输入样例】

【输出样例】

【数据范围】

开摆1下🤗

每日小练

1、排它平方数

排它平方数 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

这题给我玩阴滴嗷,我就说long long都给你爆爆了?????,原来是int * int的结果是int ,所以我们要在*之前先强转long long

#include <iostream>
#include<cstring>
using namespace std;
typedef long long LL;
bool st[20];
int main()
{
  for(int i = 123456 ; i < 1000000 ; i++)
  {
    if(i == 203879) continue;
    memset(st,false,sizeof st);
    bool flag = false;
    string as = to_string(i);
    for(int i = 0 ; i < as.size() ; i++)  
    {  
      if(st[as[i] - '0']) 
      {
        flag = true;
        break;
      }
      st[as[i] - '0'] = true;
    }
    if(flag) continue;
    LL b = (LL)i * i;			// 细节(LL)
    string bs = to_string(b);
    for(int i = 0 ; i < bs.size() ; i++)
      if(st[bs[i] - '0']) 
      {
        flag = true;
        break;
      }
    if(!flag) 
    {
      cout<<i<<endl;
      break;
    }
  }
  return 0;
}

2、买不到的数目

在这里插入图片描述

【输入输出样例】

【示例】

输入

4 7

输出

17

运行限制

  • 最大运行时间:3s
  • 最大运行内存: 64M

规律题,可以当结论,两个数(a和b)一定取不到的数是(a-1)*(b-1)

#include <iostream>
using namespace std;
int main()
{
  int a , b;
  cin >> a >> b;
  cout<< a * b - a - b << endl;
  return 0;
}

3、回文日期

在这里插入图片描述

模拟题,没有什么好🔒的了

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int mouths[] = {31,28,31,30,31,30,31,31,30,31,30,31};
bool isValid(int year,int mouth,int day)
{
  if(mouth > 12 || mouth < 0) return false;
  if(mouth != 2)
  {
    
    if(mouths[mouth-1] < day)
      return false;
  }
  else
  {
      int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
      if(mouths[mouth-1] + leap < day)
        return false;
  }
  return true;
}
int main()
{
  string date;
  cin>>date;
  int year = 0;
  for(int i = 0 ; i < 4 ; i++)
    year = year * 10 + (date[i] - '0');
  int dateMouth = ( date[4] - '0' ) * 10 + (date[5] - '0');
  int dateDay = ( date[6] - '0' ) * 10 + (date[7] - '0');
  for(int i = year ;  ; i++)      // 用i代替年来枚举
  {
    int mouth = i % 10 * 10 + i / 10 % 10 ;
    int day = i / 100 % 10 * 10 + i / 1000;
    if(i == year && mouth <= dateMouth && day <= dateMouth) continue;
    if(isValid(i, mouth , day ))
    {
      cout<<i * 10000 + mouth * 100 + day<<endl;
      break;
    }
  }
  // 枚举回文字年
  int ab = (date[0] - '0') * 10 + (date[1] - '0');
  int mm = (date[4] - '0') * 10 + (date[5] - '0');
  int abxx = ab * 100 + (date[2] - '0') * 10 + (date[3] - '0');
  
  for(int i = ab ; ; i++)
  {
    int a = i / 10;
    int b = i % 10;
    int newYear = a * 1000 + b * 100 + a * 10 + b;
    int newMouth = b * 10 + a;
    if(abxx > newYear) continue;    // 年月日比较,枚举的必须比它大
    if(abxx == newYear && mm >= newMouth) continue;
    if(isValid(newYear, newMouth, newMouth))
    {
      printf("%d%02d%02d\n",newYear,newMouth,newMouth);
      break;
    }
  }
  return 0;
}

4、约瑟夫环

在这里插入图片描述

开摆🤗🤗🤗🤗 ,真不懂

#include <iostream>
using namespace std;
int main()
{
  int n,k;
  cin >> n >> k;
  int j = 0;
  for(int i = 1 ; i <= n ; i++)
    j = (j + k) % i;
  j++;
  cout << j << endl;
  return 0;
}

🤗🤗🤗🤗,美好的一天从被麻麻结束

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值