【蓝桥杯历年真题合集】蓝桥杯2022初赛

简介: 给定一个长度为 n 的数列A1,A2,... , An 和一个非负整数 x。给定 m 次查询, 每次询问能否从某个区间 [l, r] 中选择两个数使得他们的异或等于 x。

 刷题统计

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。

他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。

请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?

输入格式

输入一行包含三个整数 a,b和 n。

输出格式

输出一个整数代表天数。

数据范围

对于 50% 的评测用例,1≤a,b,n≤10^6

对于 100%的评测用例,1≤a,b,n≤10^18

输入样例:

10 20 99
image.gif

输出样例:

8
image.gif

题解代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll a,b,n,sum = 0;
    scanf("%lld%lld%lld",&a,&b,&n);
    ll flag = n / (a * 5 + b * 2);
    n -= (a * 5 + b * 2) * flag;
    sum += flag * 7;
    if(n / a <= 5)
    {
        sum += n / a;
        if(n / a == 5)
        {
            sum += (n - 5 * a) / b;
            if((n - 5 * a) % b > 0) sum ++;
        }
        else if(n % a > 0)
        {
            sum ++;
        }
    }else
    {
        sum += 5 + (n - 5 * a) / b;
        if((n - 5 * a) % b > 0)
        {
            sum ++;
        }
    }
    printf("%lld",sum);
    return 0;
}

image.gif

修剪灌木

爱丽丝要完成一项修剪灌木的工作。

有 NN 棵灌木整齐的从左到右排成一排。

爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。

爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。

当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。

直到修剪了最左的灌木后再次调转方向。

然后如此循环往复。

灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。

在第一天的早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。

输入格式

一个正整数 N,含义如题面所述。

输出格式

输出 N 行,每行一个整数,第行表示从左到右第 i 棵树最高能长到多高。

数据范围

对于 30% 的数据,N≤10,

对于 100% 的数据,1<N≤10000。

输入样例:

3

image.gif

输出样例:

4
2
4

image.gif

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll fun(ll a,ll b,ll c)
{
  if(a > c)
  {
    if(a > b)
      return a;
    else
      return b;
  }
  else
  {
    if(c > b)
      return c;
    else
      return b;
  }
}
int main()
{
  int n, i;
  scanf("%d",&n);
  for(i = 1; i <= n; i ++)
  {
    printf("%lld\n", fun(i, 2 * (n - i), 2 * (i - 1)));
  }
  return 0;
}

image.gif

求和

题目描述

给定n个整数a[1],a[2],...,a[n],求两两相乘再相加的和,即

S=a[1]·a[2]+a[1]·a[3]+...+a[1]·a[n]+a[2]·a[3]+...+a[2]·a[n]+...+a[n-1]·a[n]

输入格式

第一行为正整数n,第二行为n个整数。

30%的数据:2≤n≤1000,1≤a[i]≤100。

100%的数据:2≤n≤200000,1≤a[i]≤1000。

输出格式

输出一个数字表示答案S。

输入样例

4
1 3 6 9

image.gif

输出样例

117

image.gif

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N=200010;
int s[N];
int a[N];
int n;
int main()
{
    cin >> n;
    ll ans = 0;
    for(int i = 1; i <= n; ++ i)
    {
        scanf("%d",&a[i]);
        s[i] += s[i - 1] + a[i];
    }
    for(int i = n; i >= 1; i --)
    {
        ans += (ll) a[i] * s[i - 1];
    }
    printf("%lld",ans);
    return 0;
}

image.gif

纸张尺寸

题目描述

在ISO 国际标准中定义了A0 纸张的大小为1189mm × 841mm。

将A0 纸沿长边对折后为A1 纸,大小为841mm × 594mm。

在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。

将A1 纸沿长边对折后为A2 纸,依此类推。

输入纸张的名称,请输出纸张的大小。

输入格式

输入一行包含一个字符串表示纸张的名称。

该名称一定是A0、A1、A2、A3、A4、A5、A6、A7、A8、A9 之一。

输出格式

输出两行,每行包含一个整数,依次表示长边和短边的长度。

输入样例

样例1:
A0
样例2:
A1

image.gif

输出样例

样例1:
1189
841
样例2:
841
594

image.gif

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    string a;
    cin >> a;
    if(a == "A0") printf("1189\n841");
    if(a == "A1") printf("841\n594");
    if(a == "A2") printf("594\n420");
    if(a == "A3") printf("420\n297");
    if(a == "A4") printf("297\n210");
    if(a == "A5") printf("210\n148");
    if(a == "A6") printf("148\n105");
    if(a == "A7") printf("105\n74");
    if(a == "A8") printf("74\n52");
    if(a == "A9") printf("52\n37");
    return 0;
}

image.gif

数位排序

小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。

当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。

例如,2022 排在 409 前面,因为2022 的数位之和是6,小于 409 的数位之和13。

又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。

给定正整数n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?

输入格式

输入第一行包含一个正整数n。

第二行包含一个正整数m。

30% 的评测用例,1 ≤ m ≤ n ≤ 300。

50% 的评测用例,1 ≤ m ≤ n ≤ 1000。

100%的评测用例,1 ≤ m ≤ n ≤ 10^6。

输出格式

输出一行包含一个整数,表示答案。

输入样例

13
5

image.gif

输出样例

3

image.gif

数据范围与提示

1到13的排序为:1, 10, 2, 11, 3, 12, 4, 13, 5, 6, 7, 8, 9。第5个数为3。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct A{
  int n1;
  int n2;
  bool operator < (const A a)const{
    if(a.n2 != n2) return a.n2 > n2;
    if(a.n2 == n2) return a.n1 > n1;
  } 
}a[N];
int main()
{
  int n, m, k, sum;
  cin >> n >> m;
  for(int i = 1; i <= n; ++ i)
    {
    a[i].n1 = i;
    k = a[i].n1;
    sum = 0;
    while(k)
    {
      sum += k % 10;
      k /= 10;
    }
    a[i].n2 = sum;  
  }
  sort(a + 1, a + n + 1);
  cout << a[m].n1;
  return 0;
}

image.gif

选数异或

(暴力写的)

给定一个长度为 n 的数列A1,A2,... , An 和一个非负整数 x。

给定 m 次查询, 每次询问能否从某个区间 [l, r] 中选择两个数使得他们的异或等于 x。

输入格式

输入第一行包含三个整数n,m,x。

第二行包含n个整数A1,A2,...,An。

接下来m行,每行两个整数l,r表示询问区间[l, r]。

20%的测试数据:1≤n,m≤100;

40%的测试数据:1≤n,m≤1000;

100%的测试数据:1≤n,m≤100000,0≤x,Ai<2^20,1≤l≤r≤n;

输出格式

对于每个询问, 如果该区间内存在两个数的异或为 x 则输出yes, 否则输出no。

输入样例

4 4 1
1 2 3 4
1 4
1 2
2 3
3 3

image.gif

输出样例

yes
no
yes
no

image.gif

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const ll N = 100000 + 10;
int n;
ll arr[N] = {0};
ll brr[N] = {0};
int main()
{
    int n, m, x;
    scanf("%d%d%d",&n,&m,&x);
    for(int i = 1; i <= n; i ++) scanf("%lld", &arr[i]);
    while(m --)
    {
        ll l, r, ans = 0, flag = 0;
        scanf("%lld%lld",&l,&r);
        for(int i = l; i <= r; i ++)
        {
            for(int j = i + 1; j <= r; j ++)
            {
                ans = arr[i] ^ arr[j];
                if(ans == x)
                {
                    flag = 1;
                    break;
                }
            }
        }
        if(flag == 1) puts("yes");
        else puts("no");
    }
    return 0;
}

image.gif


相关文章
|
6月前
|
传感器
|
搜索推荐
蓝桥杯历年真题题解----2020年-- 排序
蓝桥杯历年真题题解----2020年-- 排序