NOIP(第16届)--2010--普及组--复赛--试题与答案(NA16)

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

中小学编程红宝书.zip


关键词:

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

      2010年、普及组、复赛,第16届。

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


解析与答案:

 

1题:数字统计

1、说明

A、试题类型:

       数学问题。

 

B、算法模型:

       暴力搜索与递归。

 

C、试题说明:

       无。

 

 

 

2、代码

#include<bits/stdc++.h>

using namespace  std ;

 

int  l , r ;

int  ans =   0 ;

 

void  sss (int  x )

       if( x ==   0 ) return;   // 递归函数需要边界

       else if( x % 10   ==   2 ) ans ++; //如果扫到2出现了ans加1

       sss ( x / 10 );   // 然后把最后一位去掉接着扫

}

 

int  main ()

{

       scanf ("%d %d",& l ,& r );   // 输入l和r

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

       {   // 循环直接扫一遍

              sss ( i );

       }

       printf ("%d", ans );

       return   0 ;

}

 

 

非递归:

#include<bits/stdc++.h>

using namespace  std ;

 

int  l , r ;

int  ans =   0 ;

 

void  sss (int  x )

       if( x ==   0 ) return;   // 递归函数需要边界

       else if( x % 10   ==   2 ) ans ++; //如果扫到2出现了ans加1

       sss ( x / 10 );   // 然后把最后一位去掉接着扫

}

 

int  main ()

{

       scanf ("%d %d",& l ,& r );   // 输入l和r

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

       {   // 循环直接扫一遍

              sss ( i );

       }

       printf ("%d", ans );

 

       return   0 ;

}

    

  

 

 

 

 

2题:接水问题

1、说明

A、试题类型:

       STL应用问题。

 

B、算法模型:

       优先队列(或者说“最小堆”)来进行求解。

 

C、试题说明:

       优先队列在C++的queue库中有一个priority_queue的实现。

 

对于这道题:首先将m个数放入优先队列,然后每次从其中取出一个最小的数,再将这个数加上接下来要进去的那个人k对应的数(即为k离开的时间)。最后将优先队列里面的所有数取出来,其中最大的那个数就是答案。

 

2、代码

#include <iostream>

#include <queue>

#include <vector>

using namespace std;

 

priority_queue<int, vector<int>, greater<int> > que;

int n, m, a[10010], res = 0;

 

int main()

{

       cin >> n >> m;

 

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

              cin >> a[i];

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

              que.push(a[i]);

 

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

       {

              int t = que.top();

              que.pop();

              que.push(a[i] + t);

       }

 

       while (!que.empty())

       {

              int t = que.top();

              que.pop();

              if (t > res)

                     res = t;

       }

 

       cout << res << endl;

       return 0;

}

  

 

 

3题:导弹拦截

1、说明

A、试题类型:

       数学结合。

 

B、算法模型:

       基本数据公式。

 

C、试题说明:

先将每个导弹与第一个系统的距离的平方算出来。

 

再对距离的平方进行从大到小排序。 

 

从1开始枚举每个导弹由二系统拦截的情况。

 

每次更新二系统的最大半径和答案的最小值。

 

 

2、代码

#include<cstdio>

#include<algorithm>

using namespace std;

 

int x1,yl,x2,y2,n,ans,r1,r2;

 

struct node

{

       int x,y,d1; 

}mis[100005]; //表示横纵坐标和与一系统的距离平方

 

int dis(int x,int y,int a,int b)

{

       return (x-a)*(x-a)+(y-b)*(y-b);

   

} //因为精度的问题所以直接用平方来存距离

 

bool cmp(node a,node b)

{

       return a.d1>b.d1;

   

} //由大到小排序

 

int main()

{

       int x,y;

       scanf("%d%d%d%d%d",&x1,&yl,&x2,&y2,&n);

   

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

       {     

              scanf("%d%d",&x,&y);   

              mis[i].x=x;

              mis[i].y=y;     

              mis[i].d1=dis(x1,yl,mis[i].x,mis[i].y);    

       }

   

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

   

       r1=mis[1].d1;

       ans=r1;

   

       for(int i=2;i<=n+1;i++) //一定要注意这里是n+1,因为可能一系统一个导弹都没拦截

       {     

              r1=mis[i].d1;

              r2=max(r2,dis(x2,y2,mis[i-1].x,mis[i-1].y)); //更新二系统半径平方最大值

              ans=min(ans,r1+r2); //更新答案最小值

       }

   

       printf("%d",ans);

   

       return 0;

   

}

 

 

 

 

 

 

 

4题:三国游戏

1、说明

A、试题类型:

       算法问题。

 

B、算法模型:

       贪心。

 

C、试题说明:

      

 

 

A、在任何的操作之中,要注意不重不漏(重复的计算可能会导致运算的东西不对,有遗漏的计算会导致缺失部分数据。

 

B、贪心的策略要经过理论的判断。

 

2、代码

#include<bits/stdc++.h>

using namespace std;

 

int a[501][501]={0};

 

int main()

{

       int n;

       cin>>n;

       int score=0;

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

       {

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

              {

                     cin>>a[i][j];

              }

       }

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

       {

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

              {

                     a[i][j]=a[j][i];       

              }

       }

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

       {

              sort(a[i]+1,a[i]+n+1);

              score=max(score,a[i][n-1]);

       }

       cout<<"1"<<endl<<score;

       return 0;

}

    

 



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

联系方式:

A、官方网址:

http://www.itflight.net


B、微信公众号:

添加微信,获取资料。

image.png

 



关注公众号,获取动态。

image.png