noip普及组初赛阅读题:看最近六年不懂算法行不

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NOIP普及组初赛阅读题:看最近六年不懂算法行不?
阅读程序题是得分的关键,因为不是让你上机去运行程序,所以要一步步地读程序,记录相关变量值的变化情况。

因为程序的运行结果只有输出语句才有输出,所以只写出输出语句的结果。

有时要找出规律才能写出结果,特别是循环次数多的情况,另外要注意边界值,不能多算一步也不能少算一步。

解决这类问题的关键在于能够分析程序的结构以及程序段的功能。

常见的有列表法、画流程图法等。

完成这类题目的方法和步骤如下:1、从头到尾通读程序,大致把握程序的算法、找出这个题目的即这个程序想干什么。

抓住了它,不仅得出答案变得较容易,而且对自己的结果也会比较有信心。

2、通过给程序分段、理清程序的结构和层次,达到读懂程序的目的。

3、阅读程序中特别注意跟踪主要变量的值的变化,可以用列表的方法,了解变量变化和程序的运行结果,注意发现规律。

所谓列表法,就是将各变量名作为表头,在程序的执行过程中,将各变量值的变化记录在相应变量的下方。

4、按照程序中输出格式的要求,写出运行结果,并带着结果回到程序进行检查。

在阅读程序时,要特别注意过程、函数所完成的子任务以及和主程序之间的参数传递关系。

在阅读程序中,比较好的方法是首先阅读主程序,看其需要调用的过程或函数是什么,最后要求输出变量是什
么;其次在阅读程序中,将较长的程序分成几个程序段(特别注意循环结构、判断结构),阅读理解各程序段的功能以及各程序之间的关联。

NOIP2011-1.
#includeusing namespace std;int main(){int
i,n,m,ans;cin>>n>>m;i=n;ans=0;while(i<=m){ //从i=10~20,共循环计数11次ans+=i; //每次循环,ans 累加一次i 值i++; }cout<//此时ans值应为
(10+20)*11/2,即165return 0;}输入: 10 20输出: 165 NOIP2011-2.#include#includeusing namespace std;int main(){string map= '2223334445556667778889999';//数组中元素位置是从0开始计数的string tel;int
i;cin>>tel;for(i=0;iif((tel[i]>='0') &&
(tel[i]<='9') ) //如果输入的tel是0~9,直接输出tel值cout<else if( (tel[i]>='A') &&
(tel[i]<='Z'))cout<//如果输入的tel是A~Z,则输出一个map数组中对应的元素//输出元素在map数组中位置为“输入字母与A的ASCII码的差值”//如果输入的是其他字符,比如“-”,则不符合循环条件,无输出cout< return 0;}输入: CCF-NOIP-2011输出: 22366472011
NOIP2011-3.
#include#includeusing namespace std;const int SIZE= 100;int main(){int
n,i,sum,x,a[SIZE];cin>>n;memset(a,0,sizeof(a));for(i= 1;i<=n;i++){cin>>x;a[x]++;}//循环结束时数组中的值为:a[1]=1,a[2]=2,a[3]=3,a[4]=2,a[5]=1,
a[6]=2i=0;sum=0;while(sum<(n/2+1)){ //当sum值大于等于n/2+1,即sum>=6的时候,循环结束
i++;sum+=a[i];}cout<//输出循环结束时i 的值(不是sum 的值)return 0;}输入:114 5 6 6 4 3 32 3 2 1输出: 3
NOIP2011-4.#includeusing namespace std;int solve(int n,int m){int i,sum;if(m==1) return 1; //递归函数solve(i,m)中m=1时返回函数值为1sum=0;for(i=1;i//递归函数solve(i,m)中i=1时不循环,sum=0sum+= solve(i,m-1); return sum;//可递归求得
sum=solve(1,3)+(2,3)+(3,3)+(4,3)+(5,3)+(6,3)}int main(){int n,m;cin>>n>>m;cout<//输出函数值,即sum值return 0; }输入: 7 4输出: 20
NOIP2012-1.#includeusing namespace std;int a, b, c, d, e, ans;int main(){ cin>>a>>b>>c;
d = a+b;
e = b+c; ans = d+e;
//ans=a+b+b+c cout< return 0; }输入: 1 2 5输出: 10
NOIP2012-2.#includeusing namespace std;int n, i, ans;int main(){ cin>>n; ans = 0; for (i = 1; i
<= n; i++) if (n % i == 0)
ans++; //统计1~18中18的因数个数cout< return 0; }输入: 18输出: 6 NOIP2012-3.#includeusing 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;elsereturn 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<return 0;}输入:52-1 42 -1 -2-1 6 4 03 2 -1 5 8输出: 14
NOIP2012-4.#include#includeusing namespace std;int n, ans, i, j;string s;char get(int i){if(i < n)return s[i];elsereturn 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=7for(j = 0; j <= n-1; j++)cout<//1,ans+j<8,输出s[7+0];2,ans+j=8,输出s[8-8];3,ans+j=9,输出s[9-8]……cout<return 0; }输入: CBBADADA输出: ACBBADAD
NOIP2013-1.#includeusing namespace std;int main(){inta, b;cin>>a>>b;cout<return 0; } //输出:
3+5=8输入: 3 5输出: 3+5=8
NOIP2013-2.#includeusing namespace std;int
main(){ int a, b, u, i, num;
cin>>a>>b>>u; num = 0; for (i = a; i <= b; i++) if ((i % u) == 0)
num++; //1-100之间有多少数是15的倍数cout< return 0;}输入: 1 100 15输出: 6
NOIP2013-3.#includeusing namespace std;int
main(){ const int SIZE = 100; int n, f, i, left, right, middle, a[SIZE]; cin>>n>>f;
for (i = 1; i <= n; i++) cin>>a[i]; left = 1; right = n; do {middle= (left + right) / 2; if(f <= a[middle])right = middle; elseleft = middle +
1; }while (left < right);// middle=6,17>a[6],则left=7// middle=9,17,则right=9// middle=8,17,则right=8// middle=7,17=a[7],则right=7// left=right,直接输出leftcout<return 0;}输入:12 172 4 6 9 11 15 1718 19 20 21 25输出: 7
NOIP2013-4.#includeusing 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<return 0; }输入:62 5 3 11 12 4输出: 4。

相关文档
最新文档