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

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

中小学编程红宝书.zip

 


第1题(day1):铺地毯

1、说明

A、试题类型:

       数据模型。

 

B、算法模型:

       数组。

 

C、试题说明:

       数据范围案例。

2、代码

#include<iostream>

using namespace std;

 

int main()

{

    int n,a[10001],b[10001],x[10001],y[10001],xi,yi;

cin>>n;

 

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

    {

              cin>>a[i]>>b[i]>>x[i]>>y[i];

}

 

    cin>>xi>>yi;

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

    {

        if(a[i]<=xi&&a[i]+x[i]>=xi&&b[i]<=yi&&b[i]+y[i]>=yi)

        {

                     cout<<i;return 0;

              }

    }

cout<<-1;

 

    return 0;

}

第2题(day1):选择客栈

1、说明

A、试题类型:

       基本算法。

 

B、算法模型:

       stl算法。

 

C、试题说明:

       时间复杂度选择。

 

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 f=1,sum=0;

char ch;

 

    for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());

    if(ch=='-')

    {

        f=-1;

        ch=getchar();

}

 

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

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

 

    return sum*f;

}

 

const int maxn=2e5+10;

int n,p,k,x,y,sum[maxn],color[maxn],ans;

 

int main()

{

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

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

 

    n=getint();k=getint();p=getint();

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

    {

        x=getint();y=getint();

        color[x]++;

        if(y<=p)

        {

            for(int j=0;j<=k-1;++j)

            {

                sum[j]+=color[j];

                color[j]=0;

            }

 

            ans-=1;

        }

        ans+=sum[x];

    }

 

    cout<<ans<<endl;

    return 0;

}

第3题(day1):Mayan游戏

1、说明

A、试题类型:

       基本算法。

 

B、算法模型:

搜索 + 剪枝。

 

C、试题说明:

       无。

2、代码

#include<iostream>

#include<algorithm>

#include<cstring>

using namespace std;

 

int map[99][99],ans[99][10],lazy[99][99];

int yuan[11][11][11];

int n,flag1;

 

void copy(int x)

{

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

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

                     yuan[x][i][j]=map[i][j];

}

 

void change()

{

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

       {

              int sum=0;

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

                     if(map[i][j]==0)

                            sum++;

                     else

                     {

                            if(!sum)

                                   continue;

                           

                            map[i][j-sum]=map[i][j];

                            map[i][j]=0;  

                     }

       }

}

 

int Move()

{

       int flag=0;

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

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

              {

                     if(i-1>=1&&i+1<=5&&map[i][j]==map[i+1][j]&&map[i][j]==map[i-1][j]&&map[i][j]!=0)

                            lazy[i][j]=lazy[i-1][j]=lazy[i+1][j]=1,flag=1;

                     if(j-1>=1&&j+1<=7&&map[i][j]==map[i][j+1]&&map[i][j]==map[i][j-1]&&map[i][j]!=0)

                            lazy[i][j]=lazy[i][j-1]=lazy[i][j+1]=1,flag=1;

              }

              if(flag==0)

                     return 0;

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

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

                            if(lazy[i][j]!=0)

                            {

                                   map[i][j]=0;

                                   lazy[i][j]=0;

                            }

                            return 1;

}

 

void move(int i,int j,int x)

{

       int a=map[i][j];

       map[i][j]=map[i+x][j];

       map[i+x][j]=a;

       change();

       while(Move()==1)change();

}

 

bool check()

{

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

              if(map[i][1])

                     return 0;

              return 1;

}

 

void dfs(int x)

{

       if(check()==1)

       {

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

                     cout<<ans[i][1]<<" "<<ans[i][2]<<" "<<ans[i][3]<<endl;

              flag1=1;exit(0);

       }

       if(x==n+1)return;

       copy(x);

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

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

              {

                     if(map[i][j]){

                            if(i+1<=5&&map[i][j]!=map[i+1][j])

                            {

                                   move(i,j,1);

                                   ans[x][1]=i-1;ans[x][2]=j-1;ans[x][3]=1;

                                   dfs(x+1);

                                  

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

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

                                                 map[i][j]=yuan[x][i][j];

                                          ans[x][1]=-1;ans[x][2]=-1;ans[x][3]=-1;

                            }

                            if(i-1>=1&&map[i-1][j]==0)

                            {

                                   move(i,j,-1);

                                   ans[x][1]=i-1;ans[x][2]=j-1;ans[x][3]=-1;

                                   dfs(x+1);

                                  

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

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

                                                 map[i][j]=yuan[x][i][j];

                                          ans[x][1]=-1;ans[x][2]=-1;ans[x][3]=-1;

                            }

                     }

              }

}

 

int main()

{

       cin>>n;

      

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

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

              {

                     int x;cin>>x;

                     if(x==0)

                            break;

                     map[i][j]=x;

              }

 

              memset(ans,-1,sizeof(ans));

              dfs(1);

              if(flag1!=1)

                     cout<<-1;

              return 0;

}

 

第1题(day2):计算系数

1、说明

A、试题类型:

       数学问题与典型算法。

 

B、算法模型:

       组合数+二项式定理。

 

C、试题说明:

       无。

 

 

2、代码

#include<iostream>

#include<cstdio>

#include<algorithm>

#define ll long long

using namespace std;

const int mod=10007;

 

ll a,b,k,n,m;

 

ll ksm(ll q,ll w)

{

    ll h=1;

    while(w)

    {

        if(w&1)

            h=h*q%mod;

        q=q*q%mod;

        w>>=1;

    }

    return h;

}

 

ll jc[10000];

 

void calc()

{

    jc[1]=1;

    for(int i=2;i<=1100;++i)

        jc[i]=(jc[i-1]%mod*i)%mod;

}

 

ll inv(ll a)

{

    return ksm(a,mod-2);

}

 

ll c(ll m,ll k)

{

    ll x=jc[k]*inv(jc[m])%mod;

    ll xx=inv(jc[k-m])%mod;

    return (x*xx)%mod;

}

 

int main()

{

    cin>>a>>b>>k>>n>>m;

    calc();

    ll ans=1;

    ans=(ans*c(m,k))%mod;

    ans=(ans*ksm(a,n))%mod;

    ans=(ans*ksm(b,m))%mod;

    cout<<ans%mod;

    return 0;

}

第2题(day2):聪明的质检员

1、说明

A、试题类型:

       基本算法。

 

B、算法模型:

       二分法。

 

C、试题说明:

       循环用二分法求p-y最小时W(也就是重量标准)。

2、代码

#include<iostream>

#include<cstdio>

#include<algorithm>

using namespace std;

 

long long n,m;

long long s;

long long av[200010],an[200010];

 

struct st//存石头数据

{

    long long w,v;

}stone[200010];

 

struct ra//存范围数据

{

    long long l,r;

}range[200010];

 

int main()

{

    cin>>n>>m>>s;

    long long right=-1;

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

    {

        cin>>stone[i].w>>stone[i].v;

        right=stone[i].w>right?stone[i].w:right;//求出石头最大重量作为 第一次二分的上限

    }

    for(long long i=1;i<=m;i++)

        cin>>range[i].l>>range[i].r;

    long long left=0;

    long long minn=-1,p;

    while(left<=right)//开始循环

    {

        long long mid=(left+right)/2;//二分可行域

        av[0]=0,an[0]=0;

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

        {

            if(stone[i].w>=mid)

            {

                av[i]=av[i-1]+stone[i].v;//前缀和数组

                an[i]=an[i-1]+1;

            }

            else

            {

                av[i]=av[i-1];an[i]=an[i-1];   

            }

        }

        long long p=0;

        for(long long i=1;i<=m;i++)

        {

            p+=(av[range[i].r]-av[range[i].l-1])*(an[range[i].r]-an[range[i].l-1]);   

        }

        if(minn==-1 || minn>abs(p-s))

                     minn=abs(p-s);

             

        if(p<s)

                     right=mid-1;//准备下一次二分的上限或下限

        else left=mid+1;

    }

    cout<<minn;

      

    return 0;

}

第3题(day2):观光公交

1、说明

A、试题类型:

       基本推导。

 

B、算法模型:

       贪心应用。

 

C、试题说明:

       数据范围认真观察,它能一步一步引向正解。

 

 

2、代码

#include <bits/stdc++.h>

using namespace std;

 

const int Max=1005;

int n,m,k,ans,x;

int fa[Max*10],s[Max*10],t[Max*10],d[Max],f[Max],sum[Max],T[Max],last[Max];

//s起点t终点fa到达时间

//d原时间i~i+1时间

//f出发能影响到最远的点

//sum前i个位置下车总人数

//last在i上车的最大时间

//T到i的最短时间

 

inline void solve()

{

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

              T[i]=max(T[i-1],last[i-1])+d[i-1];

      

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

              sum[i]+=sum[i-1];

      

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

              ans+=T[t[i]]-fa[i];

      

       while(k--)

       {

              f[n]=f[n-1]=n;

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

              {

                     if(T[i+1]>last[i+1])

                            f[i]=f[i+1];

                     else

                            f[i]=i+1;

              }

             

              int maxx=0,pos=0;

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

                     if(maxx<sum[f[i]]-sum[i]&&d[i])

                            maxx=sum[f[i]]-sum[i],pos=i;

                     if(!pos)

                            break;

                     ans-=maxx,d[pos]--;

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

                            T[i]=max(T[i-1],last[i-1])+d[i-1];

       }

}

 

 

int main()

{

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

      

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

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

      

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

       {

              scanf("%d%d%d",&fa[i],&s[i],&t[i]);

              last[s[i]]=max(last[s[i]],fa[i]),sum[t[i]]++;

       }

      

       solve();

       cout<<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