CSP初赛复习(二十四)J组程序阅读题
由于CSP比赛的阅读程序题并不是上机去运行程序,所以要一步步地读程序,记录相关变量值的变化情况。因为程序的运行结果只有输出语句才有输出,所以只写出输出语句的结果。有时要找出规律才能写出结果,特别是循环次数多的情况,另外要注意边界值,不能多算一步也不能少算一步。
解决这类问题的关键在于能够分析程序的结构以及程序段的功能。常见的有列表法、画流程图法等。完成这类题目的方法和步骤如下:
1、从头到尾通读程序,大致把握程序的算法、找出这个题目的即这个程序想干什么。抓住了它,不仅得出答案变得较容易,而且对自己的结果也会比较有信心。
2、通过给程序分段、理清程序的结构和层次,达到读懂程序的目的。
3、阅读程序中特别注意跟踪主要变量的值的变化,可以用列表的方法,了解变量变化和程序的运行结果,注意发现规律。所谓列表法,就是将各变量名作为表头,在程序的执行过程中,将各变量值的变化记录在相应变量的下方。
4、按照程序中输出格式的要求,写出运行结果,并带着结果回到程序进行检查。
在阅读程序时,要特别注意过程、函数所完成的子任务以及和主程序之间的参数传递关系。在阅读程序中,比较好的方法是首先阅读主程序,看其需要调用的过程或函数是什么,最后要求输出变量是什么;其次在阅读程序中,将较长的程序分成几个程序段(特别注意循环结构、判断结构),阅读理解各程序段的功能以及各程序之间的关联。
例:
#include<iostream>
using namespace std;
int n, i, j,a[100][100];
int solve(int x,int y)
{
int u, v;
if(x == n)
return a[x][y];
//递归边界:当x=5时,solve(5,y)=a[5][y]
u= solve(x + 1, y);
v= solve(x + 1, y + 1);
if(u > v)
return a[x][y] + u;
else
return a[x][y] + v;
//用递归最终求得solve(1,1)=a[1][1]+solve(2,2)=2+12=14
}
int main()
{
cin>>n;
for(i = 1; i <= n; i++)
for (j = 1; j <= i; j++)
cin>>a[i][j];
cout<<solve(1,1)<<endl;
return 0;
}
输入:
5
2
-1 4
2 -1 -2
-1 6 4 0
3 2 -1 5 8
输出: 14
#include<iostream>
#include<string>
using namespace std;
int n, ans, i, j;
string s;
char get(int i)
{
if(i < n)
return s[i];
else
return s[i-n];
//i<8时,get(i)返回s[i];i>=8时,get(i)返回s[i-8],从第一个开始返回
}
int main()
{
cin>>s;
n= s.size();
ans= 0;
for(i = 1; i <= n-1; i++)
{
for (j = 0; j <= n-1; j++)
if (get(i+j) < get(ans+j))
{
ans = i;
break;
}
else if (get(i+j) > get(ans+j))
break;
}
//此循环执行完毕,ans=7
for(j = 0; j <= n-1; j++)
cout<<get(ans+j);
//1,ans+j<8,输出s[7+0];2,ans+j=8,输出s[8-8];3,ans+j=9,输出s[9-8]……
cout<<endl;
return 0;
}
输入: CBBADADA
输出: ACBBADAD
#include<iostream>
using namespace std;
int main()
{
constint SIZE = 100;
intheight[SIZE], num[SIZE], n, ans;
cin>>n;
for(int i = 0; i < n; i++) {
cin>>height[i];
num[i] = 1;
for (int j = 0; j < i; j++) {
if ((height[j] < height[i]) && (num[j] >= num[i]))
num[i] = num[j]+1;
}
}
//两两相比,得出num[0], num[1], num[2], num[3], num[4], num[5]
ans= 0;
for(int i = 0; i < n; i++) {
if (num[i] > ans) ans = num[i];
}
//得出num中最大值,即在数组height中第几位数值最大
cout<<ans<<endl;
return 0;
}
输入:
6
2 5 3 11 12 4
输出: 4
答案:× √ × B C C
全部 0条评论