NOIP(第05届)--1999--普及组--复赛--试题与答案(NA05)

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

中小学编程红宝书.zip


关键词:

北京中关村;海淀黄庄;北京大学;清华大学。少儿编程;中小学编程;信息学竞赛;计算机竞赛;NOIP;NOIP竞赛;CSP-J/S竞赛;NOI竞赛。北京中学;东坝。

      1999年、普及组、复赛,第5届。

面向6-18岁中小学生,做最专业的中小学编程教育。

 


解析与答案:

1题:Cantor

1、说明

A、试题类型:

       数字与图形。

 

B、算法模型:

       无。

 

C、试题说明:   

把原来的数据顺时针方向旋转45°。这样所有的数据就是一个规则的三角形。

 

每行开头的第一个数的分子都是行号n,分母都是1,每行最后一个数字分子是1,分母是n。第1行就一个数字1/1。第n行(n为奇数时),数字按照n/1,n-1/2,……,2/n+1-2,1/n+1-1这样输出。第n行(n为偶数时),数字按照1/n+1-1,2/n+1-2……n-1/2,n/1这样输出。想找到第K项数据,先要求出n。

 

当1+2+3……+n>=k,1+2+3……+(n-1)<k时,就找到了n的值。

 

然后把1+2+3……+(n-1)的和sum求出来。在第n行里从第一个数开始计数,每数一个数字,sum++。当sum=k时,找到了数字。然后输出。

 2、代码

int k=0; //k代表是第多少项

int n=0,sum=0,i=0,j=0;

 

#include<iostream>

using namespace std;

 

int main()

{

       cin>>k;

       //while循环找出第k个数在三角形的第n行

       while(sum<k){

              n++;

              sum+=n;

       }

       //cout<<n<<endl;

       sum=sum-n;

       if(n%2==1) //奇数行

       {

              for(j=n;j>=1;j--)

              {

                     sum++;

                     if(sum==k)

                     {

                            cout<<j<<"/"<<n+1-j<<endl;

                            return 0;

                     }

              }

       }

       else //偶数行

       {

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

              {

            sum++;

            if(sum==k)

            {

                cout<<j<<"/"<<n+1-j<<endl;

                return 0;

            }   

              }   

       }

       return 0;

}

   

 

 

 

2题:回文数

1、说明

A、试题类型:

       数字问题。

 

B、算法模型:

       进制模型。

 

C、试题说明:

       n进制运算:

1、当进位规范10%改为n%。

2、进位处理由/10改为/n。

3、其他运算规则不变。

2、代码

#include <iostream>

#include <cstring>

using namespace std;

 

int n,a[101],b[101],ans,i;

 

void init (int a[])

{//将数串s转化为整数数组a

    string s;

    cin>>n>>s;

    //读入字符串s

    memset(a,0,sizeof(a));

    //数组a清零

    a[0]=s.length();

    //用a[0]计算字符串s的位数

    for(i=1;i<=a[0];i++)

    {

              if(s[a[0]-i]>='0'&&s[a[0]-i]<='9')

              {

                     a[i]=s[a[0]-i]-'0';

              }

              else

              {

                     a[i]=s[a[0]-i]-'A'+10;

              }

    }

}

 

bool check(int a[])

{//判别整数数组a是否为回文数

    for(i=1;i<=a[0];i++)

    {

              if(a[i]!=a[a[0]-i+1])

                     return false;

    }

    return true;

}

 

void jia(int a[])

{//整数数组a与其反序数b进行n进制加法运算

    int i,k;

    for(i=1;i<=a[0];i++)

    {//反序数b

              b[i]=a[a[0]-i+1];

    }

    for(i=1;i<=a[0];i++)

    {//逐位相加

              a[i]+=b[i];

    }

    for(i=1;i<=a[0];i++)

    {//处理进位

              a[i+1]+=a[i]/n;

              a[i]%=n;

    }

    if(a[a[0]+1]>0)

    {//修正新的a的位数(a+b最多只能进一位)

              a[0]++;

    }

}

 

int main ()

{

    init(a);

    if(check(a))

    {

              cout<<0<<endl;

              return 0;

    }

    ans=0;

    //步数初始化为0

    while(ans<=30)

    {

              ans++;

              jia(a);

              if(check(a))

              {

                     cout<<ans<<endl;

                     return 0;

              }

    }

    cout<<"impossible";

    return 0;

}

 

3题:旅行家的预算

1、说明

A、试题类型:

       生活模型题。

 

B、算法模型:

       算法训练。

 

C、试题说明:

       在最大行驶距离内寻找比当前便宜的加油站,然后判断是否能一次到达,不能的话先加满,然后一个一个判断。直到剩下的油量不足到下一个加油站就加油,加适量。

 

2、代码

#include <iostream>

#include <string>

using namespace std;

 

 

int main()

{

       double D1,C,D2,P;

       int N;

       cin>>D1>>C>>D2>>P>>N;

       double * value = new double[N+1];//记录第i个加油站的价钱

       double * over = new double[N+1]();//记录到第i个加油站的时候还可以走多少公里

       double * way = new double[N+2];//记录第i个点离出发点的距离

       //初始化

       value[0] = P;

       way[0] = 0;

       double MAX = C*D2;//记录能行驶距离

       bool flag = false;//判断是否无解

       for(int i = 1; i<=N; i++)

       {

              cin>>way[i]>>value[i];

              if(way[i] - way[i-1]>MAX)

              {

                     flag = true;

              }

       }

 

       if(flag)

       {

              cout<<"No Solution"<<endl;

              return 0;

       }

 

       way[N+1] = D1;//终点是最后一个加油站

       int i = 0;//记录当前到达的加油站

       int j = 1;// 记录向后找到的比自己便宜的加油站的编号

       double cost = 0;//记录费用

       while(i!=N+1)

       {//直到终点才停止

              double s = 0;//记录到比自己便宜的加油站的距离

              while((s<=MAX)&&(j<=N)&&(value[i] <= value[j]))

              {//查找比自己便宜的加油站

                     j++;

                     s = s + way[j] - way[j-1];

              }

 

              if(s<=MAX)

              {//是否可以一步j加油站或不中途不加油到J

                     if(over[i]>=way[j]-way[i])

                     {//在i点加不加油

                            over[j] = over[i]-way[j]+way[i];//在i点不加油因为够油到j点

                     }

                     else

                     {//在i点加油到刚刚好到j点

                            cost = cost + (way[j]-way[i]-over[i])/D2 * value[i];

                            over[j] = 0;//到j点时刚刚没油

                     }

              }

              else

              {//到不lJ或没有找到比当前便宜的点,即在当前加满油

                     cost = cost + (MAX - over[i])/D2 * value[i];

                     j = i+1;

                     over[j] = MAX - (way[j] - way[i]);//记录到下一个加油站的时候还可以走多远

              }

              i = j;

       }

       printf("%.2f",cost);

       return 0;

}

   

 




IT航班提供:课程视频、、课程书籍、竞赛辅导、少儿编程指导、课程采购、加盟、少儿编程资料、少儿编程课程、保送生、特长生、加分、中小学计算机教育、中小学信息学、竞赛、中小学信息学课程、人工智能、中小学编程加盟、少儿编程加盟、品牌加盟、技术加盟、技术指导、课程加盟、师资培训、中小学编程教辅资料、中小学编程教师培训、少儿编程教学书籍、少儿编程视频、教学书籍、教师培训、教学视频、CSP-J/S、中小学信息学课程服务、竞赛指导、课程提供、国内外计算机中小学计算机竞赛、信息学竞赛、信息学课程提供商、信息学奥林匹克。

      

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