NOIP(第06届)--2000--提高组--复赛--试题与答案(NA06)

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

中小学编程红宝书.zip

关键词:

北京中关村;海淀黄庄;北京大学;清华大学。少儿编程;中小学编程;信息学竞赛;计算机竞赛;NOIP竞赛;CSP-J/S竞赛;NOI竞赛。2000年、提高组、复赛,第6届。

 

     

 

第1题:进制转换

1、说明

A、试题类型:

       进制问题。

 

B、算法模型:

       学科混合,属于计算机原理与变成基本组合。

 

C、试题说明:

进制转换题。进制转换就是不断除以进制数存下余数最后逆向输出。

 

这道题无法保证余数是正数,需要特判,如果<0就把除法答案+1,余数再减一个进制数(因为进制数是负数,所以相当于加上了一个正数)。

 

                                             

2、代码

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<cstring>

#include<string>

#include<ctime>

#include<cmath>

#include<algorithm>

#include<cctype>

#include<iomanip>

#include<queue>

#include<set>

using namespace std;

 

int getint()

{

    int sum=0,f=1;

    char ch;

 

    for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());

 

    if(ch=='-')

    {

        f=-1;

        ch=getchar();

    }

 

    for(;isdigit(ch);ch=getchar())

        sum=(sum<<3)+(sum<<1)+ch-48;

 

    return sum*f;

}

 

int n,nn,r,rr,cnt;

int a[100];

 

int main()

{

    freopen("change.in","r",stdin);

    freopen("change.out","w",stdout);

 

    n=getint(),r=getint();

 

    nn=n,rr=r;

 

    while(n)

    {

        a[++cnt]=n%r;

        if(a[cnt]<0)//特判

        {

            a[cnt]-=r;

            n=n/r+1;

        }

        else

            n=n/r;

    }

 

    printf("%d=",nn);

 

    for(int i=cnt;i>=1;--i)

    {

        if(a[i]>=10)

            printf("%c",'A'+a[i]-10);

        else

            cout<<a[i];

    }

 

    printf("(base%d)",rr);

    return 0;

}

第2题:乘积最大

1、说明

A、试题类型:

       基本推理。

 

B、算法模型:

       方程问题。

 

C、试题说明:   

状态转移方程:dp[i][j][kk] = max{dp[i][m][left]*dp[m+1][j][kk-left-1]}

 

dp[i][j][kk]表示从i到j(包含)使用kk个乘号分割时所得的最大值。

2、代码

#include <iostream>

#include <string>

#include <vector>

using namespace std;

 

int n,k;

char a[50];

//string a;

//vector<vector<long long>> num(n, vector<long long>(n+1, 0));

long long num[50][50];

long long dp[50][50][10];

 

int main()

{

    cin >> n >> k;

    cin >> a;

 

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

    {

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

        dp[i][i][0] = num[i][i];

 

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

        {

            num[i][j] = num[i][j-1]*10+(a[j]-'0');

            dp[i][j][0] = num[i][j];

        }

    }

 

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

    {

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

        {

            for(int kk=1; kk<=k; kk++)

            {

                long long maxV = 0;

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

                {

                    for(int left=0; left<=kk; left++)

                    {

                        if(dp[i][m][left]*dp[m+1][j][kk-left-1]>maxV)

                            maxV=dp[i][m][left]*dp[m+1][j][kk-left-1];

                    }

                }

                dp[i][j][kk] = maxV;

            }

        }

    }

 

    cout << dp[0][n-1][k];

 

    return 0;

}

第3题:单词接龙

1、说明

A、试题类型:

       基本算法。

 

B、算法模型:

       DFS。

 

C、试题说明:

       无。

 

2、代码

#include<bits/stdc++.h>

using namespace std;

 

const int MAXN=50;

string str[MAXN];

int n,used[MAXN];

int ans=0;

 

int check(string a,string b)//查找想同的部分长度

{

    int la=a.size(),lb=b.size();

    int l=min(la,lb);

      

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

       {

        int flag = 1;

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

              {

            if(a[la-i+j]!=b[j])

                flag=0;

        }

             

        if(flag)

                     return i;

    }

    return 0;

}

 

void dfs(string s,int len)

{

    ans=max(ans,len);

      

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

       {

        if(used[i]>=2) continue;

        int c=check(s,str[i]);

        if(c>0)

              {

            used[i]++;

            dfs(str[i],len+str[i].size()-c);

            used[i]--;

        }

    }

}

 

int main()

{

    cin>>n;

    getchar();

      

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

       {

        cin>>str[i];

        getchar();

        used[i]=0;

    }

      

    string s;

    cin>>s;

    dfs(' '+s,1);

    cout<<ans<<endl;

      

    return 0;

}

第4题:方格取数

1、说明

A、试题类型:

       空间想象。

 

B、算法模型:

       四维数组应用。

 

C、试题说明:

       四维数组f[ i ][ j ][ k ][ l ],当第一次走到(i,j )时并第二次走到(k,l )时取到的数之和。

 

然后再考虑当第二次走到和第一次相同位置的数已经被取走了,就只加一次。

 

2、代码

#include<cstdio>

#include<cstring>

#include<cmath>

#include<algorithm>

using namespace std;

 

int n;

int a[12][12],f[12][12][12][12];

 

int main()

{

       scanf("%d",&n);

 

       while(1)

       {

              int x,y,z;

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

 

              if(x == 0 && y == 0 && z == 0)

                     break;

 

              a[x][y] = z;

       }

 

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

       {

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

              {

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

                     {

                            int l = i + j - k;

                            if(l <= 0)

                                   break;

 

                            f[i][j][k][l] = max(f[i - 1][j][k - 1][l],max(f[i - 1][j][k][l - 1],max(f[i][j - 1][k - 1][l],f[i][j - 1][k][l - 1])));

 

                            if(i == k && j == l)

                                   f[i][j][k][l] += a[i][j];//在去的时候已经把数取走了,所以回来的路上就取不了了

                            else

                                   f[i][j][k][l] += a[i][j] + a[k][l];

                     }

              }

       }

 

       printf("%d",f[n][n][n][n]);

 

       return 0;

}

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