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

✅个人主页:程序猿追

✅系列专栏:算法合集

✅目前状态:创建Java学习之路(零基础到就业实战)系列,目前更新到JAVAWEB开发

✅作者简介:大家好,我是程序猿追,全栈领域新星创作者,算法爱好者,常在作者周榜排名前30,某不知名的 ACMer

✅推荐一款刷题面试找工作三不误的网站——牛客网

✅个人名言:不积跬步无以至千里,趁年轻,使劲拼,给未来的自己一个交代!

  刷题统计 

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

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

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

输入格式

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

输出格式

输出一个整数代表天数。

数据范围

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

输入样例:

10 20 99

输出样例:

8

 题解代码如下:

#include 

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;
}



修剪灌木

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

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

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

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

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

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

然后如此循环往复。

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

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

输入格式

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

输出格式

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

数据范围

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

输入样例:

3

输出样例:

4
2
4

#include

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;
}

 求和

题目描述

给定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

输出样例

117
#include
#include

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;
}

 纸张尺寸

题目描述

在ISO 国际标准中定义了A0 纸张的大小为1189mm × 841mm。
将A0 纸沿长边对折后为A1 纸,大小为841mm × 594mm。
在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。
将A1 纸沿长边对折后为A2 纸,依此类推。
输入纸张的名称,请输出纸张的大小。

输入格式

输入一行包含一个字符串表示纸张的名称。
该名称一定是A0、A1、A2、A3、A4、A5、A6、A7、A8、A9 之一。

输出格式

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

输入样例 

样例1:
A0

样例2:
A1

输出样例 

样例1:
1189
841

样例2:
841
594

#include 
#include 
 
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;
}

 数位排序

小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。
当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,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

输出样例 

3

数据范围与提示

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

#include 
#include 
#include 
#include 

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;
}

选数异或

(暴力写的)

给定一个长度为 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

输出样例 

yes
no
yes
no
#include 
#include 
 
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;
}

算法对程序员来说及其重要,语言和开发平台不断变化,但是万变不离其宗的是那些算法和理论,依稀记得我那个玩的很好的一个学长(在大二就拿到了 offer),他告诉我想找一个好的工作,那刷题一定是必不可少的

现在算法刷题平台还是蛮多的,给大家介绍一个我认为与大厂关联最深的平台——牛客网

你可能感兴趣的:(【蓝桥杯合集】,蓝桥杯,排序算法,职场和发展)