NOIP(第04届)--1998--提高组--复赛--试题与答案(NA04)

2022-07-04 已有0人阅读 作者: IT航班

中小学编程红宝书.zip

关键词:

北京中关村;海淀黄庄;北京大学;清华大学。少儿编程;中小学编程;信息学竞赛;计算机竞赛;NOIP竞赛;CSP-J/S竞赛;NOI竞赛。1998年、提高组、复赛,第4届。

 


  

第1题:车上人数

1、说明

A、试题类型:

       多答案。

 

B、算法模型:

       递推、经典数学公式套用等。

 

C、试题说明:

       思路1:

枚举。枚举第二站上、下车的人数,然后根据题目给出的递推关系判断是否正确。这里的递推关系很清晰,注意数据规模。

 

思路2:

递推。把每站上、下车的人数和上、下车后的总人数用一张表列出来:

车站:    1         2       3        4          5           ……

总数:    a         a       2a      2a+x        3a+2x       ……

上:      a         x       a+x     a+2x        2a+3x       ……

下:      0         x       x       a+x         a+2x        ……

一种简单的方法是根据这个规律使用计算机进行模拟公式计算,可以定义一个结构体类型来表示公式,也可以使用数组,使用结构体是为了表达更清晰:

 

struct gs{

    int a;      //a的个数

    int x;      //x的个数   公式=ka+jx

}

struct {

    gs up;      //上的人数

    gs down;    //下的人数

    gs rs;      //上、下车后的总人数

}Chezhan[21];

 

使用循环模拟上面的上、下车过程。

Chezhan[i].up=Chezhan[i-1].up+Chezhan[i-2].up;

Chezhan[i].down=Chezhan[i-1].up;         //这样用要使用运算符重载

 

最后得到公式是:ka+jx=m,k和j的值在过程中可以计算出来,m和a是已知的。

求解x的过程中如果可以除尽,说明有有效值。如果(m-ka)%j!==0,说明除不尽,答案为No Answer.。有了x的值,代入p号站的rs公式中即可得到结果。代码例程1说明了计算过程。

 

思路3:

对斐波那契数列相关属性的运用。通过公式的推导,可以最大可能的提高运算效率。这里涉及到的数列属性最好能够记下来。

2、代码

#include<iostream>

using namespace std;

 

struct gs

{                                  //定义公式结构体

       int a;

       int x;

};

 

struct

{                                     //定义车站数组

       gs rs;

       gs up;

       gs down;

}INFO[21];

 

int main()

{

       int a, n, m, p, x;

       scanf("%d%d%d%d", &a, &n, &m, &p);

      

       INFO[1].up.a=1;                         //初始信息

       INFO[2].up.x=1;

       INFO[2].down.x=1;

       INFO[1].rs.a=1;

       INFO[2].rs.a=1;

      

       for(int i=3; i<n; i++)

       {                 //在循环中递推

              INFO[i].up.a=INFO[i-1].up.a+INFO[i-2].up.a;

              INFO[i].up.x=INFO[i-1].up.x+INFO[i-2].up.x;

              INFO[i].down.a=INFO[i-1].up.a;

              INFO[i].down.x=INFO[i-1].up.x;

              INFO[i].rs=INFO[i-1].rs;

              INFO[i].rs.a+=INFO[i].up.a;

              INFO[i].rs.a-=INFO[i].down.a;

              INFO[i].rs.x+=INFO[i].up.x;

              INFO[i].rs.x-=INFO[i].down.x;

              //printf("%d*a+%d*x\n", INFO[i].rs.a, INFO[i].rs.x);调试代码,输出过程中数据

       }

      

       if((m-INFO[n-1].rs.a*a)%INFO[n-1].rs.x)

       {//x不能整除,无答案

              printf("No answer.");

              return 0;

       }

       else

       {                                  //x可以被整除

              x=(m-INFO[n-1].rs.a*a)/INFO[n-1].rs.x;

              printf("%d", INFO[p].rs.a*a+INFO[p].rs.x*x);

       }

      

       return 0;

}

第2题:最大整数

2、说明:

A、试题类型:

       字符串问题。

 

B、算法模型:

       stl应用。

 

C、试题说明:

       用字符串读入,排个序输出。

2、代码

#include<iostream>

#include<algorithm>

#include<string>

using namespace std;

 

string s[25];

 

bool cmp(string a,string b)

{

  return a+b>b+a;

}

 

int main()

{

  int n,i,j,k;

  scanf("%d",&n);

 

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

         cin>>s[i];

 

  sort(s+1,s+1+n,cmp);

 

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

         cout<<s[i];

 

  cout<<endl;

 

  return 0;

}

第3题:进位制

1、说明

A、试题类型:

       数学问题。

 

B、算法模型:

       矩阵考察。

 

C、试题说明:

       “+”号不管,最上面一行和最左边一行不管,从剩下的(N-1)*(N-1) 的矩阵中数单个字母的个数,个数减一是每个字母的值。

2、代码

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

 

char tmp[256];

char u[10];

int v[10];

 

int main()

{

    int n;

    char cv;

    scanf("%d\n+",&n);

    n--;

    for(int i=0;i<n;i++)

              scanf(" %c",&cv),u[i]=cv;

 

    for(int i=0;i<n;i++)

    {

        scanf("\n%c",&cv);

        for(int j=0;j<n;j++)

        {

            scanf(" %s",tmp);

            if(strlen(tmp)==1)

            {

                for(int k=0;k<n;k++)

                {

                    if(u[k]==tmp[0])

                    {

                                          v[k]++;

                                          break;   

                    }

                }

            }

           

        }

    }

 

    for(int i=0;i<n;i++)

              printf("%c=%d  ",u[i],v[i]-1);

 

    printf("\n%d",n);

 

    return 0;

}

    

 

IT航班支持----中小学编程比赛汇总:

 

第一部分:国内比赛(IT航班支持)   

1、软件能力认证(CSP-JS) 

2、全国青少年信息学奥林匹克联赛(NOIP)    

3、全国青少年信息学奥林匹克竞赛(NOI)

4、中国青少年………………………  

5、………………………创新挑战赛  

6、全国青少年………………………  

7、………………………

8、 恩欧希教育信息化发明创新奖  

9、世界机器人大赛(WRC) 

10、………………………大赛    

11、少………………………智能教育成果展示大赛 

12、“明天小小科学家”奖励活动

13、………………………    

14、………………………    

15、国际信息学……………………… 

16、………………………    

 

第二部分:国际比赛(IT航班支持)   

17、………………………    

18、国际………………………    

19、………………………

20、美国信息学……………………… 

21、加拿大……………………… 

22、官方邀请赛 (CCO)     

23、国际计算思维………………………    

24、美国计算机……………………… 

25、澳大利亚………………………    

 

第三部分:企业比赛(IT航班支持)   

26、微软MTA    

27、………………………挑战赛 

28、………………………科学奖 

29、………………………学奖    

30、………………………创新挑战赛 

31、………………………挑战赛 

32、………………………芯计算机表演赛 

33、………………………大赛    

 

第四部分:Scratch相关竞赛(IT航班支持)    

34、全国中小学生电脑制作大赛     

35、………………………    

36、………………………    

37、………………………    

 

第五部分:其它(IT航班支持)   

38、NOI夏令营  

39、NOI冬令营(NOIWC)  

40、全国青少年……………………… 

41、国际青少年………………………

 

联系方式:

A、官方网址:

http://www.itflight.net


B、微信公众号:

添加微信,获取资料。

image.png

 



关注公众号,获取动态。

image.png