NOIP(第10届)--2004--普及组--复赛--试题与答案(NA10)

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

中小学编程红宝书.zip

关键词:

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

      2004年、普及组、复赛,第10届。

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

 


解析与答案:

1题:不高兴的津津

1、说明

A、试题类型:

       生活问题。

 

B、算法模型:

       基本推导。

 

C、试题说明:

注意数据范围及提示。

 

将两个数加起来超过8的在前面的星期几输出出来。

 

i控制的是星期几,从头遍历sum数组 只要找到比8大的就输出i,然后跳出循环输出0的条件是 看七天是不是都没有超过8。只要个数等于7就输出0。

2、代码

#include <iostream>

using namespace std;

 

int main()

{

       int school[7] = {};

       int af_school[7] = {};

       int unhappy = 0; // 0:高兴; 1:不高兴;

       int most_unhappy = 0;

       int index = 0;

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

       {

              cin >> school[i] >> af_school[i];

       }

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

       {

              if ((school[i] + af_school[i]) > 8)

              {

                     unhappy = 1;

                     if ((school[i] + af_school[i]) > most_unhappy)

                     {

                            most_unhappy = school[i] + af_school[i];

                            index = i;

                     }

              }

       }

       if (unhappy == 1)

       {

              cout << (index + 1) << endl;

       }

       else if (unhappy == 0)

       {

              cout << 0 << endl;

       }

       return 0;

}

   

 

 

 

 

 

2题:花生采摘

1、说明

A、试题类型:

       生活问题。

 

B、算法模型:

       STL算法。

 

C、试题说明:

       相对简单。

2、代码

#include<cstdio>//c++标准包

#include<cmath>//c++数学包

#include<vector>//命名包

#include<algorithm>//算法包,用sort要导这个包

 

using std::sort;//c++STL内置函数快速引用声明,即后面无需再用std::sort的形式,只要用sort就能使用,导出命名空间

using std::vector;

 

struct Peanut

{//结构体,相当于自建了一个列表((x,y,nums),(,,),(,,)...)里面的内容在后面通过用户输入添加

       int x;//列数

       int y;//行数

       int nums;//种子数量

       Peanut(int _x,int _y,int _nums):x(_x),y(_y),nums(_nums){}//构造函数

};

 

vector<Peanut> p;//把Peanut 命名为 p

 

bool cmp(Peanut a,Peanut b)

{

       return a.nums > b.nums;//降序排序,若为a<b,则是升序排序

}//自己编写排序规则函数

 

int main(int argc, char const *argv[])

{

       int a,b,k;//a是列,b是行,k是限定的时间

      

       while(~scanf("%d%d%d", &a, &b, &k))

       {//或者while(scanf("%d%d%d",&a,&b,&k) != EOF)

              p.clear();//清除上次的数据

              int temp;//输入的种子数量,要输入a*b个数

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

              {

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

                     {

                            scanf("%d",&temp);

                            if(temp>0)

                            {

                                   p.push_back(Peanut(i,j,temp));//如果种子数量大于0,则计入排序列表,参与后面的//排序

                            }

                     }

              }

              sort(p.begin(),p.end(),cmp);//给生成的数组排序

             

              int cost = 0;

              int Amount = 0;

              for(int i=0;i<p.size();i++)

              {//列表操作部分了

                     if(i==0)

                     {

                            cost += p[i].x+1;

                     }

                     else

                     {

                            cost += abs(p[i].x-p[i-1].x)+abs(p[i].y-p[i-1].y)+1;

                     }

                     if(cost+p[i].x>k)

                     {//这个部分就是判断是否超出所限时间

                            break;

                     }

                     else

                     {

                            Amount += p[i].nums;

                           

                     }

              }

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

       }

       return 0;

}

 

   

 

 

3题:FBI

1、说明

A、试题类型:

       基本数据机构。

 

B、算法模型:

       FBI树。

 

C、试题说明:

       首先将输入的字符串递归转换为二叉树,对于各个部分的左子树、右子树,判定其所包含孩子的'0'或'1'的个数来判断类型。

 

2、代码

#include<iostream>

#include<algorithm>

#include<cstring>

using namespace std;

 

int n;

string a;

 

char print(int left,int right)

{

       int s1=0,s2=0;

       for(int i=left;i<=right;i++)

       {

              if(a[i]=='0')s1++;

              if(a[i]=='1')s2++;

       }

       if(s1!=0&&s2!=0)return 'F';

       if(s1==0&&s2!=0)return 'I';

       else return 'B';

}

 

void calc(int left,int right)

{

       if(left!=right)

       {

              calc(left,(left+right)/2);

              calc((left+right)/2+1,right);

       }

       cout<<print(left,right);

}

 

int main()

{

       cin>>n>>a;

       calc(0,a.length()-1);

       return 0;

}

    

 

 

4题:火星人

1、说明

A、试题类型:

       STL算法选择。

 

B、算法模型:

       库函数应用。

 

C、试题说明:

题目:给定一个序列,输出这个序列在全排列集合中后面的第m个序列。

 

就是求m次当前序列的下一个字典序最小的序列。

 

两种做法:

 

A、库函数next_permutation 直接秒杀,使用方法见代码。

B、手写next_permutation函数。

 

思路:

首先:目标是要将一个序列转换成比他字典序大的最小的一个序列,得将某些元素交换位置,这个交换发生在序列的尾部会使得它增大的幅度尽可能地小。

 

其次:从尾部开始遍历元素,若是元素慢慢增大,显然这些元素都是无法交换的,因为显然在当前几个元素组成的序列中,这种升序(从后往前看)是最大的,那么当找到第一个减小的元素,就可以操作了,因为显然这种情况不是这些元素组成序列的最大情况。

 

建议:增大的幅度尽可能地小,将当前元素位置记为k,从k+1开始找到第一个刚好大于K号元素的数字,然后交换它们,因为这是第一个刚好大于K号元素的数字,所以它前面的元素大于k号元素,它后面的元素小于k号元素,交换完位置之后,k+1号元素–n号元素依旧是降序的,为了使得增大的幅度尽可能地小,翻转它们就好了。

 

2、代码

#include<bits/stdc++.h>

using namespace std;

 

const int N=10010;

int n,m;

int q[N];

 

/*

    next_permutation传入参数与sort函数一致,将传入序列变为字典序大1的下一个序列

*/

int main()

{

    cin>>n>>m;

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

              cin>>q[i];

 

    while(m--)

              next_permutation(q,q+n);

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

              cout<<q[i]<<' ';

 

    cout<<endl;

 

    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