NOIP(第17届)--2011--普及组--复赛--试题与答案(NA17)

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

中小学编程红宝书.zip


关键词:

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

      2011年、普及组、复赛,第17届。

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

 


解析与答案:



1题:数字反转

1、说明

A、试题类型:

       送分题。

 

B、算法模型:

       基本数字。

 

C、试题说明:

       无。

 

2、代码

#include<bits/stdc++.h>

using namespace std;

 

long long int ff(int x)

{

       int s=0;

       while(x>0)

       {

              s=s*10+x%10;

              x=x/10;

       }

       return s;

}

 

int main()

{

       int n;

       cin>>n;

       if(n>=0)

              cout<<ff(n);

       else

              cout<<-ff(abs(n));

}

2题:统计单词数

1、说明

A、试题类型:

       统计问题。

 

B、算法模型:

       基本计算。

 

C、试题说明:

       无。

 

2、代码

#include <cstdio> 

#include <cstring> 

 

int main() 

    char a[1100], b[1000001]; 

    while(gets(a)!=NULL) 

    { 

        gets(b); 

        strcat(a," "); 

        strcat(b," ");

        int i, s, n=0,  j, ss=0, k,rec; 

        for (i = 0; a[i] != '\0'; i++) 

        { 

            if (a[i] >= 'a') 

                a[i] -= 'a' - 'A'; 

        } 

        for (i = 0; b[i] != '\0'; i++) 

        { 

            if (b[i] >= 'a') 

                b[i] -= 'a' - 'A'; 

        }

        for (i = 0; b[i] != '\0'; i++) 

        { 

            if (b[i] == ' ') 

            { 

                s=1; 

                for (j = n,k = 0; j <= i, a[k] != '\0'; j++, k++) 

                { 

                    if(b[j] == a[k])  

                                          s*=1;

                    else  

                                          s*=0;

                } 

                if (s == 1) 

                                   ss++;

                if (ss == 1 && s==1) 

                                   rec = n; 

                n=i; 

                n++; 

            } 

        } 

        if (ss == 0) 

        { 

            ss = -1; 

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

        } 

        else if (ss >0) 

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

    } 

    return 0; 

3题:瑞士轮

1、说明

A、试题类型:

       STL算法。

 

B、算法模型:

       sort。

 

C、试题说明:

       归并排序的合并。

 

2、代码

#include <cstdio>

#include <algorithm>

const int N=100010;

 

struct node

{

    int num,score,w;

    bool friend operator <(node n1,node n2)

    {

        if(n1.score==n2.score) return n1.num<n2.num;

        return n1.score>n2.score;

    }

    bool friend operator >(node n1,node n2)

    {

        if(n1.score==n2.score) return n1.num<n2.num;

        return n1.score>n2.score;

    }

}a[N<<1],b[N<<1];

 

int n,r,q;

 

void merge()

{

    int l1=1,l2=(n>>1)+1,cnt=0;

    while(l1<=(n>>1)&&l2<=n)

    {

        if(b[l2]>b[l1])

            a[++cnt]=b[l2++];

        else

            a[++cnt]=b[l1++];

    }

    while(l1<=(n>>1))

        a[++cnt]=b[l1++];

    while(l2<=n)

        a[++cnt]=b[l2++];

}

 

int main()

{

    scanf("%d%d%d",&n,&r,&q);

    n<<=1;

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

    {

        scanf("%d",&a[i].score);

        a[i].num=i;

    }

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

        scanf("%d",&a[i].w);

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

    {

        if(i==1) std::sort(a+1,a+1+n);

        else merge();

        int cnt1=0,cnt2=n>>1;

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

        {

            if(a[j].w>a[j+1].w)

                a[j].score++,b[++cnt1]=a[j],b[++cnt2]=a[j+1];

            else

                a[j+1].score++,b[++cnt2]=a[j],b[++cnt1]=a[j+1];

        }

    }

    merge();

    printf("%d\n",a[q].num);

    return 0;

}

4题:表达式的值

1、说明

A、试题类型:

       表达式问题。

 

B、算法模型:

       树问题。

 

C、试题说明:

一、 首先粗略地说一下表达式计算的方法: 需要使用两个栈,一个存放结果,另一个存放符号。每次读入一个数据,就进入结果栈,如果是符号,则按以下方法:

 

1、   如果是左括号,就直接进栈;

 

2、   如果是右括号,就一直弹栈并加以计算,直到弹到左括号;

 

3、 如果是运算符,则弹栈,直到这个运算符的优先级大于符号栈栈顶的符号的优先级 或是左括号或栈空,然后将运算符进栈; 最后再将栈中残余的符号和结果一直弹到只剩一个结果,这个就是最后的结果。

 

二、 此题算法的框架整体上是和表达式计算相同的,有以下几个方面不同:

 

1、 需要添加数字的地方应该满足不在右括号的后面或者左括号的前面。

 

2、 优先级:“*”的优先级比“+”高。

 

3、运算方法,每一步计算为0或1的方法数:设两个步骤的运算结果经过每个符号到一个结果时,第一个运算结果算出0的方案数为t1,1的方案数为t2,第二个算出0的方案数为t3,算出1的方案数为t4,则有: 当符号是“⊕”时,得到0的方案数为t1*t3,1的方案数:t1*t4+t2*t3+t2*t4 当符号是“×”时,得到0的方案数为t1*t3+t1*t4+t2*t3,1的方案数:t2*t4 用一个栈记录下来即可。

 

2、代码

#include<stdio.h>

 

const int M=10007,N=100005;

int n,i,u[N],v[N],top,k;

char c[N],sta[N],ans[2*N];

 

int main()

{

    //freopen("exp.in","r",stdin);

    //freopen("exp.out","w",stdout);

    scanf("%d\n%s",&n,c);

    ans[++k]='.';

    for(i=0;c[i];i++)

 

    {

        if(c[i]=='('||c[i]=='*')

            sta[++top]=c[i];

        if(c[i]=='+')

        {

            while(sta[top]=='*')

                ans[++k]=sta[top--];

            sta[++top]=c[i];

        }

 

        if(c[i]==')')

        {

            while(sta[top]!='(')

                ans[++k]=sta[top--];

            top--;

        }

 

        if(c[i]!='('&&c[i]!=')')

            ans[++k]='.';

    }

 

    while(top>0)

        ans[++k]=sta[top--];

 

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

    {

        if(ans[i]=='.')

        {

            u[++top]=1;

            v[top]=1;

        }

 

        if(ans[i]=='*')

        {

            top--;

            u[top]=(u[top+1]*v[top]+u[top]*v[top+1]+u[top]*u[top+1])%M;

            v[top]=v[top]*v[top+1]%M;

        }

 

        if(ans[i]=='+')

        {

            top--;

            v[top]=(u[top+1]*v[top]+u[top]*v[top+1]+v[top]*v[top+1])%M;

            u[top]=u[top]*u[top+1]%M;

        }

    }

 

    printf("%d",u[1]);

}





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