2020【第十一届蓝桥杯省赛】 CC++ B组

2020【第十一届蓝桥杯省赛】 CC++ B组 ,第1张

文章目录
  • 1、跑步训练
  • 2、纪念日
  • 3、合并检测
  • 4、REPEAT 程序
  • 5、矩阵
  • 6、整除序列
  • 7、解码
  • 8、走方格
  • 9、整数拼接

1、跑步训练

【问题描述】
小明要做一个跑步训练。



初始时,小明充满体力,体力值计为10000。


如果小明跑步,每分钟损耗600 的体力。


如果小明休息,每分钟增加300 的体力。


体力的损耗和增加都是均匀变化的。



小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。


如果某个时刻小明的体力到达0,他就停止锻炼。



请问小明在多久后停止锻炼。


为了使答案为整数,请以秒为单位输出答案。



答案中只填写数,不填写单位。


答案:3880

#include
using namespace std;
 
 
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	
 	int init = 10000;
 	int ans = 0;
	 	
 	while(init>=0){
 		
		int t = 60;
		while(init >=0 &&t!=0){
			init-=10;
			t--;
			ans++;
			if(init==0){
				cout << ans;
				return 0;
			}
		}
		
 		init+=300;
 		ans+=60;
 	}
	return 0;
} 
2、纪念日

【问题描述】
2020 年7 月1 日是中国共产党成立99 周年纪念日。



中国共产党成立于1921 年7 月23 日。



请问从1921 年7 月23 日中午12 时到2020 年7 月1 日中午12 时一共包含多少分钟?

答案:52038720
直接使用excel计算。



ans = 36138*24*60

3、合并检测

问题描述】
新冠疫情由新冠病毒引起,最近在A 国蔓延,为了尽快控制疫情,A 国准备给大量民众进病毒核酸检测。


然而,用于检测的试剂盒紧缺。



为了解决这一困难,科学家想了一个办法:合并检测。


即将从多个人(k个)采集的标本放到同一个试剂盒中进行检测。



如果结果为阴性,则说明这k个人都是阴性,用一个试剂盒完成了k 个人的检测。



如果结果为阳性,则说明至少有一个人为阳性,需要将这k 个人的样本全部重新独立检测(从理论上看,如果检测前k -1 个人都是阴性可以推断出第k 个人是阳性,但是在实际 *** 作中不会利用此推断,而是将k 个人独立检测),加上最开始的合并检测,一共使用了k + 1 个试剂盒完成了k 个人的检测。



A 国估计被测的民众的感染率大概是1%,呈均匀分布。



请问k 取多少能最节省试剂盒?

答案:10

**设总共n个人,设k人一组,首先需要n/k个试剂盒,其中有n/100个人感染,假设这些感染的人分布在不同的组,因此最多还需要增加 (n/100)k 个试剂盒,最多需要n/k+nk/100个试剂盒, 对勾函数,基本不等式,k=10时取最小值 **

4、REPEAT 程序

【问题描述】
附件prog.txt 中是一个用某种语言写的程序。



其中REPEAT k 表示一个次数为k 的循环。


循环控制的范围由缩进表达,
从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。



例如如下片段:

REPEAT 2:
	A = A + 4
	REPEAT 5:
		REPEAT 6:
			A = A + 5
		A = A + 7
	A = A + 8
A = A + 9
...
...
...

该片段中从A = A + 4 所在的行到A = A + 8 所在的行都在第一行的循环两次中。



REPEAT 6: 所在的行到A = A + 7 所在的行都在REPEAT 5: 循环中。



A = A + 5 实际总共的循环次数是2×5×6 = 60 次。



请问该程序执行完毕之后,A 的值是多少?

答案:241830
使用记事本自带的替换功能,改成python的循环格式最后打印出来就好。



5、矩阵

把1 ~ 2020 放在2 ×1010 的矩阵里。


要求同一行中右边的比左边大,同一列中下边的比上边的大。


一共有多少种方案?
答案很大,你只需要给出方案数除以2020 的余数即可。


#include 
using namespace std;

int f[1020][1020];

int main()
{

    f[0][0] = 1;                                   // 两行一个数字都不放,也是一种方案
    for (int i = 0; i <= 1010; i ++)
        for (int j = 0;  j <= 1010; j ++)
        {
            if(i - 1 >= j)                         // 转移前的状态也要合法,即第一行的数量不小于第二行的数量
                f[i][j] += f[i - 1][j] % 2020;
            if(j)
                f[i][j] += f[i][j - 1] % 2020;
        }

    cout << f[1010][1010] << endl;
    return 0;
}

6、整除序列

【问题描述】
有一个序列,序列的第一个数是n,后面的每个数是前一个数整除2,请输
出这个序列中值为正数的项。



【输入格式】
输入一行包含一个整数n。



【输出格式】
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。


【样例输入】

20

【样例输出】

20 10 5 2 1

【评测用例规模与约定】
对于80% 的评测用例,1 <= n <= 1E9。



对于所有评测用例,1 <= n <= 1E18。


#include 
using namespace std;

int main() {
   long long n;
   cin >> n;
   while(n){
   	cout << n << " ";
   	n/=2;
   }  
   return 0;
}
7、解码

【问题描述】
小明有一串很长的英文字母,可能包含大写和小写。



在这串字母中,有很多连续的是重复的。


小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母+ 出现次数的形式。



例如,连续的5 个a,即aaaaa,小明可以简写成a5(也可能简写成a4a、aa3a 等)。



对于这个例子:HHHellllloo,小明可以简写成H3el5o2。


为了方便表达,小明不会将连续的超过9 个相同的字符写成简写的形式。



现在给出简写后的字符串,请帮助小明还原成原来的串。



【输入格式】
输入一行包含一个字符串。



【输出格式】
输出一个字符串,表示还原后的串。


【样例输入】

H3el5o2

【样例输出】

HHHellllloo

【评测用例规模与约定】
对于所有评测用例,字符串由大小写英文字母和数字组成,长度不超过100。



请注意原来的串长度可能超过100。


#include 
using namespace std;

int main() {
   
   string s;
   cin >> s;
   
   string ans;
   
   for(int i = 0; i < s.size(); i++){
   	if(isdigit(s[i])){
   		int l = s[i]-'0';
   		char c = s[i-1];
   		l--;
   		
   		while(l){
   			ans+=c;	
   			l--;	
   		}
   	}else{
   		ans += s[i];
   	}
   }
   
   cout << ans;
     
   return 0;
}
8、走方格

【问题描述】
在平面上有一些二维的点阵。



这些点的编号就像二维数组的编号一样,从上到下依次为第1 至第n 行,从左到右依次为第1 至第m 列,每一个点可以用行号和列号来表示。



现在有个人站在第1 行第1 列,要走到第n 行第m 列。


只能向右或者向下走。



注意,如果行号和列数都是偶数,不能走入这一格中。



问有多少种方案。



【输入格式】
输入一行包含两个整数n, m。



【输出格式】
输出一个整数,表示答案。


【样例输入】

3 4

【样例输出】

2

【样例输入】

6 6

【样例输出】

0

【评测用例规模与约定】
对于所有评测用例,1 <= n <= 30, 1 <= m <= 30。


#include 
using namespace std;
bool vis[31][31];
int n,m;
int dirs[2][2]={1,0,0,1};
int ans = 0;


void dfs(int x, int y){
    if(x==n+1 || y==m+1)return;

    if(x == n && y == m){
        /*
         * for(int i =1 ; i <= n; i++){
            for(int j = 1; j <= m; j++){
                cout << vis[i][j]<<" ";

            }
            cout << endl;
        }
        cout << "*******" << endl;
         * */
        ans++;
        return;
    }

    for(int i = 0; i < 2; i++){
        int nx = x+dirs[i][0];
        int ny = y+dirs[i][1];
        if(nx%2 == 0 && ny%2 == 0)continue;

        if(!vis[nx][ny]){
            vis[nx][ny] = true;
            dfs(nx,ny);
            vis[nx][ny] = false;
        }

    }

}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin >> n >> m;
    vis[1][1]=true;
    dfs(1,1);

    cout << ans;
    return 0;
}

有位大佬的代码参考下。


#include
using namespace std;

int n, m, ans = 0;
int a[31][31];
int main() {
	cin >> n >> m;
	a[1][1] = 1;
	for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
			if ((i&1) == 0 && (j&1) == 0)
				continue;			
			if (i-1>=1)
				a[i][j] += a[i-1][j];
			if (j-1>=1)
				a[i][j] += a[i][j-1];
		}
	cout << a[n][m] << endl;
	return 0;
} 

9、整数拼接

【题目描述】
给定一个长度为 n 的数组 A1,A2,⋅⋅⋅,An。



你可以从中选出两个数 Ai 和 Aj(i 不等于 j),然后将 Ai 和 Aj 一前一后拼成一个新的整数。



例如 12 和 345 可以拼成 12345 或 34512。



注意交换 Ai 和 Aj 的顺序总是被视为 2 种拼法,即便是 Ai=Aj 时。



请你计算有多少种拼法满足拼出的整数是 K 的倍数。



【输入格式】
第一行包含 2 个整数 n 和 K。



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



【输出格式】
一个整数代表答案。



【数据范围】
1≤n≤105,
1≤K≤105,
1≤Ai≤109

【输入样例】

4 2
1 2 3 4

【输出样例】

6

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/569000.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存