NOIP(第15届)--2009--提高组--复赛--试题与答案(NA15)

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

中小学编程红宝书.zip

 


第1题:潜伏者

1、说明

A、试题类型:

       送分题。

 

B、算法模型:

       STL应用。

 

C、试题说明:

       相对比较简单。

2、代码

#include<iostream>

#include<cstring>

using namespace std;

 

string a,b;

int k[1000][3];

int bb[26];

 

int main()

{

       cin>>a>>b;

      

       memset(k,0,sizeof(k));

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

       {

              if( k[ a[i]-'A' ][1] == 0 )

              {

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

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

                     bb[b[i] -'A'] ++;

              }

              else

              {

                     if(k[ a[i]-'A' ][2] != (b[i] -'A' ))

                     {

                            cout<<"Failed";

                            return 0;

                     }

              }

       }

      

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

       {

              if(k[i][1] == 0        || bb[i] == 0)

              {

                     cout<<"Failed";

                     return 0;

              }

       }

      

       string s;

       cin>>s;

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

       {

              s[i] = k[ s[i] -'A' ][2] + 'A' ;

       }

      

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

       {

              cout<<s[i];

       }

      

       return 0;

}

 

第2题:hankson的趣味题

1、说明

A、试题类型:

       推导问题。

 

B、算法模型:

       公式证明。

 

C、试题说明:

公式证明与化简。

2、代码

#include<cstdio>

using namespace std;

 

int gcd(int a,int b)

{

    return b==0?a:gcd(b,a%b);

}

 

int main()

{

    int T;

    scanf("%d",&T);

    while(T--)

       {

        int a0,a1,b0,b1;

        scanf("%d%d%d%d",&a0,&a1,&b0,&b1);

        int p=a0/a1,q=b1/b0,ans=0;

        for(int x=1;x*x<=b1;x++)

            if(b1%x==0)

                     {

                if(x%a1==0&&gcd(x/a1,p)==1&&gcd(q,b1/x)==1) ans++;

                int y=b1/x;//得到另一个因子

                if(x==y) continue;

                if(y%a1==0&&gcd(y/a1,p)==1&&gcd(q,b1/y)==1) ans++;

            }

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

    }

    return 0;

}

第3题:最优贸易

1、说明

A、试题类型:

       算法问题。

 

B、算法模型:

       DFS、状态转移方程。

 

C、试题说明:

       在图上用dfs进行dp转移,对于每个节点记录从1到该节点所有路径的最大差值,然后最后输出n即可。

 

最小权值,状态转移方程。

2、代码

#include <bits/stdc++.h>

using namespace std;

 

namespace StandardIO

{

    template<typename T>inline void read (T &x)

       {

        x=0;T f=1;char c=getchar();

        for (; c<'0'||c>'9'; c=getchar())

                     if (c=='-')

                            f=-1;

                     for (; c>='0'&&c<='9'; c=getchar())

                            x=x*10+c-'0';

                     x*=f;

    }

      

    template<typename T>inline void write (T x)

       {

        if (x<0)

                     putchar('-'),x*=-1;

             

        if (x>=10)

                     write(x/10);

             

        putchar(x%10+'0');

    }

      

}

 

using namespace StandardIO;

 

namespace Project

{

   

    const int N=500500;

    const int INF=2147483647;

   

    int n,m;

    int a[N];

    int cnt;

    int head[N];

    struct node

       {

        int to,next;

    } edge[N<<1];

      

    int f[N],mina[N];

   

    inline void add (int a,int b)

       {

        edge[++cnt].to=b,edge[cnt].next=head[a],head[a]=cnt;

    }

      

    void dfs (int now,int fa,int minn)

       {

        int flag=1;

        minn=min(minn,a[now]);

             

        if (mina[now]>minn)

                     mina[now]=minn,flag=0;

             

        if (f[now]<max(f[fa],a[now]-minn))

                     f[now]=max(f[fa],a[now]-minn),flag=0;

             

        if (flag)

                     return;

             

        for (register int i=head[now]; i; i=edge[i].next)

              {

            int to=edge[i].to;

            dfs(to,now,minn);

        }

    }

      

    inline void MAIN ()

       {

        read(n),read(m);

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

                     read(a[i]),mina[i]=INF;

             

        for (register int i=1; i<=m; ++i)

              {

            int x,y,z;

            read(x),read(y),read(z);

            add(x,y);

            if (z==2) add(y,x);

        }

             

        dfs(1,0,INF);

        write(f[n]);

    }

}

 

int main () {

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

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

    Project::MAIN();

}

第4题:靶形数独

1、说明

A、试题类型:

       计数组合。

 

B、算法模型:

       搜索 + 二进制优化。

 

C、试题说明:

       简单问题。

 

 

2、代码

#include<cstdio>

#include<cstring>

#include<algorithm>

#define lowbit(x) (x&(-x))

 

const int Loc[9][9] = {

{0,0,0,1,1,1,2,2,2},

{0,0,0,1,1,1,2,2,2},

{0,0,0,1,1,1,2,2,2},

{3,3,3,4,4,4,5,5,5},

{3,3,3,4,4,4,5,5,5},

{3,3,3,4,4,4,5,5,5},

{6,6,6,7,7,7,8,8,8},

{6,6,6,7,7,7,8,8,8},

{6,6,6,7,7,7,8,8,8}};

 

const int Val[9][9] = {

{6,6,6,6,6,6,6,6,6},

{6,7,7,7,7,7,7,7,6},

{6,7,8,8,8,8,8,7,6},

{6,7,8,9,9,9,8,7,6},

{6,7,8,9,10,9,8,7,6},

{6,7,8,9,9,9,8,7,6},

{6,7,8,8,8,8,8,7,6},

{6,7,7,7,7,7,7,7,6},

{6,6,6,6,6,6,6,6,6}};

int ans = -1;

 

int yes[10];

int H[10],L[10],X[10];

int rep[1<<9],cnt[1<<9];

 

int Init()

{

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

       {

        rep[1<<i] = i;

        H[i] = L[i] = X[i] = (1<<9)-1;

    }

      

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

        cnt[i] = cnt[i-lowbit(i)] + 1;

      

    int val, ret = 0, t;

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

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

              {

            scanf("%d",&val);

            if(val)

                     {

                t = 1 << val-1;

                H[i] ^= t;

                L[j] ^= t;

                X[Loc[i][j]] ^= t;

                ret += val * Val[i][j];

            }

            else

                            yes[i] |= (1<<j);

        }

              return ret;

}

 

void Dfs(int sum)

{

    int t,j,tot,val,x,y,mn = 10;

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

       {

        t = yes[i];

        while(t)

              {

            j = lowbit(t), t ^= j, j = rep[j];

            tot = cnt[H[i]&L[j]&X[Loc[i][j]]];

            if(tot < mn)

                     {

                mn = tot;

                x = i, y = j;

            }

        }

    }

      

    if(mn == 10)

       {

        if(sum > ans) ans = sum;

        return;

    }

      

    yes[x] ^= 1<<y;

    t = H[x]&L[y]&X[Loc[x][y]];

      

    while(t)

       {

        val = lowbit(t), t ^= val;

        H[x] ^= val, L[y] ^= val, X[Loc[x][y]] ^= val;

        Dfs(sum + Val[x][y]*(rep[val]+1));

        H[x] ^= val, L[y] ^= val, X[Loc[x][y]] ^= val;

    }

    yes[x] ^= 1<<y;

}

 

 

int main()

{

    Dfs(Init());

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

    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