分享

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

 长沙7喜 2018-04-16


阅读程序题是得分的关键,因为不是让你上机去运行程序,所以要一步步地读程序,记录相关变量值的变化情况。因为程序的运行结果只有输出语句才有输出,所以只写出输出语句的结果。有时要找出规律才能写出结果,特别是循环次数多的情况,另外要注意边界值,不能多算一步也不能少算一步。

解决这类问题的关键在于能够分析程序的结构以及程序段的功能。常见的有列表法、画流程图法等。完成这类题目的方法和步骤如下:

1、从头到尾通读程序,大致把握程序的算法、找出这个题目的即这个程序想干什么。抓住了它,不仅得出答案变得较容易,而且对自己的结果也会比较有信心。

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

3、阅读程序中特别注意跟踪主要变量的值的变化,可以用列表的方法,了解变量变化和程序的运行结果,注意发现规律。所谓列表法,就是将各变量名作为表头,在程序的执行过程中,将各变量值的变化记录在相应变量的下方。

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

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


NOIP2011-1.

#include

using 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,即165

return 0;

}

输入: 10  20

输出 165



NOIP2011-2.

#include

#include

using namespace std;

int main()

{

string map= '2223334445556667778889999';

//数组中元素位置是从0开始计数的  

string tel;

int i;

cin>>tel;

for(i=0;i

if((tel[i]>='0') && (tel[i]<='9') )  

//如果输入的tel0~9,直接输出tel

cout<

else if( (tel[i]>='A') && (tel[i]<='Z'))

cout<

//如果输入的telA~Z,则输出一个map数组中对应的元素

//输出元素在map数组中位置为输入字母与AASCII码的差值

//如果输入的是其他字符,比如“-”,则不符合循环条件,无输出

      cout<

      return 0;

}

输入: CCF-NOIP-2011

输出:  22366472011



NOIP2011-3.

#include

#include

using 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]=1a[2]=2a[3]=3a[4]=2a[5]=1a[6]=2

i=0;

sum=0;

while(sum<(n/2+1)){  

//sum值大于等于n/2+1,即sum>=6的时候,循环结束

i++;

sum+=a[i];

}

cout<

//输出循环结束时 i 的值(不是sum的值)

return 0;

}

输入:

11

4 5 6 6 4 3 32 3 2 1

输出3



NOIP2011-4.

#include

using namespace std;

int solve(int n,int m)

{

int i,sum;

if(m==1) return 1; 

//递归函数solve(i,m)m=1时返回函数值为1

sum=0;

for(i=1;i

//递归函数solve(i,m)i=1时不循环,sum=0

sum+= 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.

#include

using 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.

#include

using namespace std;

int n, i, ans;

int main()

{

      cin>>n;

      ans = 0;

      for (i = 1; i <= n; i++)

                  if (n % i == 0)

                     ans++;

                     //统计1~1818的因数个数

      cout<

      return 0;    

}

输入: 18

输出:  6


 

NOIP2012-3.

#include

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<

return 0;

}

输入:

5

2

-1 4

2 -1 -2

-1 6 4 0

3 2 -1 5 8

输出:  14



NOIP2012-4.

#include

#include

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<8get(i)返回s[i]i>=8get(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<

//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.

#include

using namespace std;

int main()

{

inta, b;

cin>>a>>b;

cout<

return 0;    

//输出:3+5=8

输入: 3  5

输出3+5=8



NOIP2013-2.

#include

using 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.

#include

using 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; 

else

left = middle + 1;  

}while (left < right);

// middle=617>a[6],则left=7

// middle=917,则right=9

// middle=817,则right=8

// middle=717=a[7],则right=7

// left=right,直接输出left

cout<

return 0;

}

输入:

12 17

2 4 6 9 11 15 1718 19 20 21 25

输出:  7



NOIP2013-4.

#include

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<

return 0;    

}

输入:

6

2  5  3  11  12  4

输出:  4



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多