NOIP(第14届)--2008--提高组--复赛--试题与答案(NA14)

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

中小学编程红宝书.zip

 


第1题:笨小猴

1、说明

A、试题类型:

       送分题。

 

B、算法模型:

       枚举与快排。

 

C、试题说明:

       无。

 

2、代码

#include <iostream>

#include <cstdio>

#include <cmath>

#include <cstring>

using namespace std;

 

bool prime(int n)

{

       if(n==0||n==1)

       {

              return false;

       }

      

       if(n==2)

       {

              return true;

       }

      

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

       {

              if(n%i==0)

              {

                     return false;

              }

       }

       return true;

}

 

int main()

{

       char s[1000];

       cin>>s;

       int a[24]={0},maxn=-999,minn=999;

       for(int i=0;i<strlen(s);i++)

       {

              a[s[i]-'a']++;

       }

      

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

       {

              if(a[i]>maxn)

              {

                     maxn=a[i];

              }

             

              if(a[i]<minn&&a[i]!=0)

              {

                     minn=a[i];

              }

       }

      

       int p=maxn-minn;

       if(prime(p))

       {

              cout<<"Lucky Word"<<endl;

              cout<<p;

       }

       else

       {

              cout<<"No Answer"<<endl;

              cout<<0;

       }

       return 0;

}

 

第2题:火柴棒等式

1、说明

A、试题类型:

       送分题。

 

B、算法模型:

       枚举与快排,暴力枚举。

 

C、试题说明:

       若符合条件,计数器++。

 

构建一个求所有数字(非一位数)火柴棒数的函数。代码如下。

 

int f(int x)

{

    int ans=0;

    if(x==0) return 6;

    while(x)

    {

        ans=ans+d[x%10];

        x/=10;

    }

    return ans;

}

 

 

2、代码

#include<iostream>

using namespace std;

 

int d[10]={6,2,5,5,4,5,6,3,7,6}; //记录每个一位数所需的火柴棒数量

int i,j,n;

int a,b,c,cnt=0; //cnt为计数器

 

int f(int x)

{

    int ans=0;

    if(x==0)

              return 6;

 

    while(x)

    {

        ans=ans+d[x%10]; //每一位数所需的火柴棒数

        x/=10;

    }

    return ans;

}

 

int main()

{

    cin>>n;

 

    for(i=0;i<=1000;i++)

    {

        for(j=0;j<=1000;j++) //暴力枚举

        {

            a=f(i);

                   b=f(j);

                   c=f(i+j);

                   if((n-4-a-b)==c) cnt++; //判断是否满足条件

           }

      }

    cout<<cnt;

    return 0;

}

第3题:传纸条

1、说明

A、试题类型:

       路径问题。

 

B、算法模型:

       逻辑推导。

 

C、试题说明:

       无。

 

2、代码

#include <bits/stdc++.h>

using namespace std;

 

const int Max=55;

int n,m;

int f[Max][Max][Max][Max],num[Max][Max];

 

int main()

{

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

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

              for(int j=1;j<=m;j++) scanf("%d",&num[i][j]);

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

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

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

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

                                   {

                                          int p1x=i-1,p1y=j,p2x=i,p2y=j-1;

                                          int p3x=a-1,p3y=b,p4x=a,p4y=b-1;

                                          if(p1x!=p3x&&p1y!=p3y)

                                                 f[i][j][a][b]=max(f[i][j][a][b],f[p1x][p1y][p3x][p3y]+num[i][j]+num[a][b]);

                                         

                                          if(p1x!=p4x&&p1y!=p4y)

                                                 f[i][j][a][b]=max(f[i][j][a][b],f[p1x][p1y][p4x][p4y]+num[i][j]+num[a][b]);

                                         

                                          if(p2x!=p3x&&p2y!=p3y)

                                                 f[i][j][a][b]=max(f[i][j][a][b],f[p2x][p2y][p3x][p3y]+num[i][j]+num[a][b]);

                                         

                                          if(p2x!=p4x&&p2y!=p4y)

                                                 f[i][j][a][b]=max(f[i][j][a][b],f[p2x][p2y][p4x][p4y]+num[i][j]+num[a][b]);

                                          //if(i==a&&j==b) f[i][j][a][b]-=num[i][j];

                                   }

                                   cout<<f[n][m][n][m];

                                   return 0;

}

第4题:双栈排序

1、说明

A、试题类型:

       复杂结构。

 

B、算法模型:

       二分图。

 

C、试题说明:

       设输入数组为a[n]:

 

     (1):结论:设1<= i < j < n 若存在 j < k <= n 使 a[k] < a[i] < a[j] 则a[i],a[j]不可能进入同一个栈。

 

证明:

若a[i],a[j]进入了同一个栈。

因为a[k] < a[i] < a[j] 所以出栈顺序为a[k] a[i] a[j]。

a[i]入栈,a[j]入栈使需将a[i]出栈,但a[i]应在a[k]后入栈,推出矛盾。

 

(2)建立图论模型:

将a中元素当做点,利用(1)若i,j不可存在于同一个栈,则i,j间连边。

不难推出,若此图为二分图,则此组数据有解。

2、代码

#include<vector>

#include<cstdio>

#include<cstring>

#include<iostream>

#include<algorithm>

using namespace std;

 

int n;

int a[1005],mina[1005];

vector<int> e[1005];

bool book[1005] = {0};

int color[1005] = {0};

bool ans = true;

int s1[1005],top1 = -1,s2[1005],top2 = -1;

 

void push1(int x)

{

       s1[++top1] = x;

       cout<<"a ";

}

 

void pop1(int &now)

{

       top1--;

       now++;

       cout<<"b ";

}

 

void push2(int x)

{

       s2[++top2] = x;

       cout<<"c ";

}

 

void pop2(int &now)

{

       top2--;

       now++;

       cout<<"d ";

}

 

void make_edge(int x,int y)

{

       e[x].push_back(y);

       e[y].push_back(x);

}

 

void dfs(int now)

{

       for(int i = 0;i < e[now].size();i++)

       {

              int nxt = e[now][i];

              if(!book[nxt])

              {

                     color[nxt] = -color[now];

                     book[nxt] =true;

                     dfs(nxt);

              }

              else if(color[nxt] + color[now] != 0)

              {

                     ans = false;

                     return;

              }

       }

}

 

int main()

{

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

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

       scanf("%d",&n);

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

              scanf("%d",a+i);

       mina[n-1] = a[n-1];

       for(int i = n - 2;i >= 0;i--)

              mina[i] = min(a[i],mina[i+1]);

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

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

                     if(a[i] < a[j] && a[i] > mina[j+1])

                            make_edge(i,j);

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

              if(!book[i])

              {

                     color[i] = 1;

                     dfs(i);

                     if(!ans)

                            break;

              }

       if(!ans)

              cout<<0;

       else

       {

              int now = 1;

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

              {

                     if(color[i] == 1)

                            push1(a[i]);

                     while(top1 >= 0 && s1[top1] == now)

                            pop1(now);

                     if(color[i] == -1)

                     {

                            while(top2 >= 0 && a[i] > s2[top2])

                            {

                                   while(now == s1[top1])

                                          pop1(now);

                                   if(now == s2[top2])

                                          pop2(now);

                            }

                            push2(a[i]);

                     }

              }

              while(now <= n)

              {

                     if(s1[top1] == now)

                            pop1(now);

                     else

                            pop2(now);

              }

       }

       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