(编程思维\gz -C++普及组)
海淀区第八届“智慧杯”
中小学生计算机程序设计大赛
编程思维赛项( C++普及组)
主办单位:北京市海淀区教育科学研究院
承办单位:网易集团 有道小图灵 1
第1题: 01 数阵
题目描述
小图灵发现计算机内部是采用二进制数进行运算的,也就是只有
和 。他对此非常感兴趣,写下了
行 列只含 和 的数阵,请你帮忙找到哪一行 出现的次数最多。
输入描述
第一行为两个正整数 ,分别表示数阵的行数和列数。
接下来 行,每行 个数,只包含 和 。
输出描述
输出一个整数,表示 出现次数最多的行号。
如果有多行满足条件,输出最小的行号。
样例1
输入
输出
样例2 输入
输出
2 5
1 1 1 1 1 1
1 0 0 1 0 01 2 3
11
5 6
1 1 0 0 1 0
0 1 1 0 1 1
1 0 0 1 0 0
1 1 0 0 1 1
0 0 1 0 0 0
1 2 3 4 5 6
21
(编程思维\gz -C++普及组) O
。
数据范围
对于
20 % 的数据, 。
对于另外 30% 的数据,数阵中至少存在一行全是
对于
100% 的数据, 。
注:数阵保证含 。
本题给出
行 列只含 和 的数阵,寻找 的个数最多的行号。因此先对每行求和得到 的个数,
再打擂台求最大值,同时更新最大值所在的行号即可。易错点为局部变量和全局变量的使用。
根据本题数据范围,很容易得到部分分。有 的数据只有 行,因此分别求这两行 的个数进行大
小比较即可。对于另外 的数据,数阵中至少有一行只含有 ,说明该行 的个数正好为 ,因此
需找到第一次出现的 的个数等于 的行号。
标程 100%
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, m, t, nmax = -1, ans = -1;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++){
int sum = 0; //sum存储每一行1的个数
for(int j = 1; j <= m; j++){
scanf("%d", &t);
sum += t;
}
if(sum > nmax){
nmax = sum; //nmax存储一行中出现最多1的次数
ans = i; //ans存储出现最多1的行号
}
}
printf("%d", ans);
return 0;
}
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
解析
(编程思维\gz -C++普及组) 3
第2题:数字升级
题目描述
小图灵得到了一个数字
,但他觉得这个数字太无趣了,因此想对这个数字进行若干次升级操作。
定义一次升级操作为:将当前数字的每一位加 后写下来,就得到了升级后的数字。
例如:将 升级一次,即逐位加 后,得到 。
请问经过 次升级操作后,最终得到的数字的长度是多少,结果对 取余。
输入描述
第一行一
2024年北京海淀区第八届“智慧杯”编程思维-C++普及组题目及题解