【答案】
#include<iostream> #include<string> using namespace std; int main() { string s; cin >> s; int length = s.size(); int x=0,y=0,z=0; for(int i=0;i<length;i++){ if('A'<=s[i]&&s[i]<='Z'){ x++; } else if('a'<=s[i]&&s[i]<='z'){ y++; } else if('0'<=s[i]&&s[i]<='9'){ z++; } } cout << x << endl; cout << y << endl; cout << z; return 0; } G:整除序列(20分)【问题描述】
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输
出这个序列中值为正数的项。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
【样例输入】
20【样例输出】
20 10 5 2 1【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ n ≤ 109。
对于所有评测用例,1 ≤ n ≤ 1018。
【解题思路】
这道题思路也不难,给出一个数,不断除2,迭代至答案n为0即可。
【答案】
#include<iostream> #include<string> using namespace std; int main() { int n; cin >> n; while(n>0){ cout << n << " "; n /= 2; } return 0; } H:走方格(20分)【问题描述】
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,
从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下
走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
【输入格式】
输入一行包含两个整数 n, m。
【输出格式】
输出一个整数,表示答案。
【样例输入】
3 4【样例输出】
2【样例输入】
6 6【样例输出】
0【评测用例规模与约定】
对于所有评测用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30。
【解题思路】
这题算是图论里面比较基础一道题,寻找路径的种树,可以用搜索来做,也可以用动态规划。和走台阶也类似,,每一个位置都有两种走法,向右走,向下走,除掉边界和不可到达的点。
建立一个二维数组,不使用0坐标,从1开始算边界,二维数组进行循环,当横纵坐标有一个为1,则说明是边界,设置为1,当横纵坐标是偶数时,说明,此点不可达,设为0,其余位置值为左位置和上位置值之和,解决了此问题。
【答案】
#include<iostream> #include<algorithm> using namespace std; int a[35][35]; int main() { for(int i=0;i<35;i++){ fill(a[i],a[i]+35,0); } for(int i=0;i<35;i++){ a[i][1]=1; a[1][i]=1; } int n,m; cin >> n >> m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(i==1||j==1){ a[i][j]=1; } else if(i%2==0&&j%2==0){ a[i][j]=0; } else { a[i][j]=a[i-1][j]+a[i][j-1]; } } } return 0; } I:字符串编码(25分)【问题描述】
小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大
写字母,小明将它转换成它在 26 个英文字母中序号,即 A → 1, B → 2, … Z →
26。
这样一个字符串就能被转化成一个数字序列:
比如 ABCXYZ → 123242526。
现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样
的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字
符串。
【输入格式】
一个数字序列。
【输出格式】
一个只包含大写字母的字符串,代表答案
【样例输入】
123242526【样例输出】
LCXYZ【评测用例规模与约定】
对于 20% 的评测用例,输入的长度不超过 20。
对于所有评测用例,输入的长度不超过 200000。
【解题思路】