2021年——第十二届蓝桥杯大赛软件赛国赛C/C++ 大学 C 组

第十二届蓝桥杯大赛软件赛决赛C/C++ 大学 C 组

整体来说,这次难易题都有还是挺均匀的。奈何纯质数没跑出来把自己惊到了。
最后坐上了二等奖的末班车哈哈哈,把去年的遗憾补回来了,满足了。ƪ(˘⌣˘)┐

大学的最后一场比赛愉快的结束了~

试题 A: 整数范围

本题总分:5 分
【问题描述】
用 8 位二进制(一个字节)来表示一个非负整数,表示的最小值是 0,则
一般能表示的最大值是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

255

试题 B: 带宽

本题总分:5 分
【问题描述】
小蓝家的网络带宽是 200 Mbps,请问,使用小蓝家的网络理论上每秒钟最
多可以从网上下载多少 MB 的内容。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

20

试题 C: 纯质数

本题总分:10 分
【问题描述】
如果一个正整数只有 1 和它本身两个约数,则称为一个质数(又称素数)。
前几个质数是:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, ···。
如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2,
3, 5, 7, 23, 37 都是纯质数,而 11, 13, 17, 19, 29, 31 不是纯质数。当然 1, 4, 35
也不是纯质数。
请问,在 1 到 20210605 中,有多少个纯质数?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:1903

这道题当时没运行出来,结束之后才发现一个我自己的致命习惯问题,判断质数时我没有加优化条件 i*i<=n,我怕不是想跳西湖。被自己的智商惊了,简单题没做出来就很难受。

代码:

#include<bits/stdc++.h>
using namespace std;
int check(int n){
	for(int i=2;i*i<=n;i++){
		if(n%i==0){
			return 0;
		}
	}
	return 1;
}
int check2(int n){
	while(n){
		int k=n%10;
		if(check(k)==0 ||k==1 ||k==0){
			return 0;
		}
		n=n/10;
	}
	return 1;
}
int main(){
	long long ans=0;
	for(int i=1;i <= 20210605 ;i++){
		if(check2(i) && check(i)){
			ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
} 

试题 D: 完全日期

本题总分:10 分
【问题描述】
如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日
期。
例如:2021 年 6 月 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 16,而
16 是一个完全平方数,它是 4 的平方。所以 2021 年 6 月 5 日是一个完全日期。
例如:2021 年 6 月 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16,
是一个完全平方数。所以 2021 年 6 月 23 日也是一个完全日期。
请问,从 2001 年 1 月 1 日到 2021 年 12 月 31 日中,一共有多少个完全日
期?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

977

代码(直接暴力):

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int year(int n){
	if((n%4==0&&n%100!=0) || (n%400==0)){
		return 29;
	}
	else{
		return 28;
	}
}
int quzhen(int n){
	int sum=0;
	while(n){
		int k=n%10;
		sum+=k;
		n=n/10;
	}
	return sum;
}
int check(int n){
	int k=sqrt(n);
	if(k*k==n){
		return 1;
	}
	return 0;
}
int main(){
	int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int ans=0;
	for(int i=2001;i<=2021;i++){
		for(int j=1;j<=12;j++){
			day[2]=year(i);
			for(int z=1;z<=day[j];z++){
				int a=quzhen(i)+quzhen(j)+quzhen(z);
				cout<<i<<" "<<j<<" "<<z<<" "<<a<<" "<<check(a)<<endl;
				if(check(a)){
					ans++;
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
//977

试题 E: 最小权值

本题总分:15 分
【问题描述】
对于一棵有根二叉树 T,小蓝定义这棵树中结点的权值 W(T) 如下:
空子树的权值为 0。
如果一个结点 v 有左子树 L, 右子树 R,分别有 C(L) 和 C® 个结点,则
W(v) = 1 + 2W(L) + 3W® + (C(L)) 2 C®。
树的权值定义为树的根结点的权值。
小蓝想知道,对于一棵有 2021 个结点的二叉树,树的权值最小可能是多
少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

这道真的不会 -_-,盲猜满二叉树,没时间算随便填了一个。

试题 F: 大写

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母
转换成大写字母后将字符串输出。
【输入格式】
输入一行包含一个字符串。
【输出格式】
输出转换成大写后的字符串。
【样例输入 1】
LanQiao
【样例输出 1】
LANQIAO
【评测用例规模与约定】
对于所有评测用例,字符串的长度不超过 100。

代码:

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main(){
	string s;
	while(cin>>s){
		int len=s.length();
		for(int i=0;i<len;i++){
			if(s[i]>='a'&&s[i]<='z'){
				s[i]=s[i]-'a'+'A';
			}
		}
		cout<<s<<endl;
	}
	return 0;
}

试题 G: 123

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
小蓝发现了一个有趣的数列,这个数列的前几项如下:
1, 1, 2, 1, 2, 3, 1, 2, 3, 4, …
小蓝发现,这个数列前 1 项是整数 1,接下来 2 项是整数 1 至 2,接下来
3 项是整数 1 至 3,接下来 4 项是整数 1 至 4,依次类推。
小蓝想知道,这个数列中,连续一段的和是多少。
【输入格式】
输入的第一行包含一个整数 T,表示询问的个数。
接下来 T 行,每行包含一组询问,其中第 i 行包含两个整数 l i 和 r i ,表示
询问数列中第 l i 个数到第 r i 个数的和。
【输出格式】
输出 T 行,每行包含一个整数表示对应询问的答案。

【样例输入】

3
1 1
1 3
5 8

【样例输出】

1
4
8

【评测用例规模与约定】
对于 10% 的评测用例,1 ≤ T ≤ 30, 1 ≤ l i ≤ r i ≤ 100。
对于 20% 的评测用例,1 ≤ T ≤ 100, 1 ≤ l i ≤ r i ≤ 1000。
对于 40% 的评测用例,1 ≤ T ≤ 1000, 1 ≤ l i ≤ r i ≤ 10 6 。
对于 70% 的评测用例,1 ≤ T ≤ 10000, 1 ≤ l i ≤ r i ≤ 10 9 。
对于 80% 的评测用例,1 ≤ T ≤ 1000, 1 ≤ l i ≤ r i ≤ 10 12 。
对于 90% 的评测用例,1 ≤ T ≤ 10000, 1 ≤ l i ≤ r i ≤ 10 12 。
对于所有评测用例,1 ≤ T ≤ 100000, 1 ≤ l i ≤ r i ≤ 10 12 。

卑微暴力骗点分>_<

代码:

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int t;
long long a,b;
long long s[1000000];
int main(){
	while(cin>>t){
		while(t--){
			cin>>a>>b;
			int k=1,j=0;
			long long sum=0;
			for(int i=1;i<=b;i++){
				j++;
				if(j>k){
					k++;
					j=1;
				}
				//cout<<j<<endl;
				if(i>=a){
					sum+=j;
				}
			}
			cout<<sum<<endl;
		}
	}
	return 0;
}

试题 H: 异或变换

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
小蓝有一个 01 串 s = s 1 s 2 s 3 ··· s n 。
以后每个时刻,小蓝要对这个 01 串进行一次变换。每次变换的规则相同。
对于 01 串 s = s 1 s 2 s 3 ··· s n ,变换后的 01 串 s ′ = s ′
1 s′2 s′3 ··· s′n为:s ′1= s 1 ;s ′i= s i−1 ⊕ s i 。
其中 a ⊕ b 表示两个二进制的异或,当 a 和 b 相同时结果为 0,当 a 和 b
不同时结果为 1。
请问,经过 t 次变换后的 01 串是什么?
【输入格式】
输入的第一行包含两个整数 n, t,分别表示 01 串的长度和变换的次数。
第二行包含一个长度为 n 的 01 串。
【输出格式】
输出一行包含一个 01 串,为变换后的串。

【样例输入】

5 3
10110

【样例输出】

11010

【样例说明】
初始时为 10110,变换 1 次后变为 11101,变换 2 次后变为 10011,变换 3
次后变为 11010。

【评测用例规模与约定】
对于 40% 的评测用例,1 ≤ n ≤ 100, 1 ≤ t ≤ 1000。
对于 80% 的评测用例,1 ≤ n ≤ 1000, 1 ≤ t ≤ 10 9 。
对于所有评测用例,1 ≤ n ≤ 10000, 1 ≤ t ≤ 10 18 。

刚开始是走暴力路线,后面发现每个串变换都是有个循环周期的就优化了一下。先把循坏周期找出来,然后取个余。应该可以混点分吧~

代码:

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
long long n,t;
string str;
string s;
string check(string s2){
	for(int i=1;i<n;i++){
		if(s2[i]==s[i-1]){
			s2[i]='0';
		}
		else{
			s2[i]='1';
		}
	}
	return s2;
}
int main(){
	int p=0;
	while(cin>>n>>t){
		cin>>s;
		p=0;
		map<string,int>mp;
		map<int,string>mp2;
		for(int i=1;i<=t;i++){
			str=check(s);
			if(mp[str]==0){
				mp[str]=i;
				mp2[i]=str;
			}
			else{
				p=i;
				break;
			}
			s=str;
			//cout<<i<<" "<<s<<endl;
		}
		if(p==0){
			cout<<s<<endl;
		}
		else{
			
			int h=(p-mp[str]);
			p=t%h;
			//cout<<p<<" "<<(p-mp[str])<<endl;
			if(p==0){
				p=h;
			}
			cout<<mp2[p]<<endl;
		}	
	}
	
	
	return 0;
}
/*
5 9
10110
*/

试题 I: 巧克力

时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分
【问题描述】
小蓝很喜欢吃巧克力,他每天都要吃一块巧克力。
一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力,每种巧
克力有自己的价格、数量和剩余的保质期天数,小蓝只吃没过保质期的巧克力,
请问小蓝最少花多少钱能买到让自己吃 x 天的巧克力。
【输入格式】
输入的第一行包含两个整数 x,n,分别表示需要吃巧克力的天数和巧克力
的种类数。
接下来 n 行描述货架上的巧克力,其中第 i 行包含三个整数 a i ,b i ,c i ,表示
第 i 种巧克力的单价为 a i ,保质期还剩 b i 天(从现在开始的 b i 天可以吃),数
量为 c i 。
【输出格式】
输出一个整数表示小蓝的最小花费。如果不存在让小蓝吃 x 天的购买方案,
输出 −1。

【样例输入】

10 3
1 6 5
2 7 3
3 10 10

【样例输出】

18

试题 I: 巧克力

第十二届蓝桥杯大赛软件赛决赛 C/C++ 大学 C 组
【样例说明】
一种最佳的方案是第 1 种买 5 块,第 2 种买 2 块,第 3 种买 3 块。前 5 天
吃第 1 种,第 6、7 天吃第 2 种,第 8 至 10 天吃第 3 种。
【评测用例规模与约定】
对于 30% 的评测用例,n, x ≤ 1000。
对于所有评测用例,1 ≤ n, x ≤ 100000,1 ≤ a i ,b i ,c i ≤ 10 9 。

此题看了一眼感觉是dp,奈何咱不会写唉~

代码:


  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值