NOIP(第08届)--2002--提高组--复赛--试题与答案(NA08)

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

中小学编程红宝书.zip

关键词:

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

 

 

第1题:均分纸牌

1、说明

A、试题类型:

       基本算法考察。

 

B、算法模型:

       贪心算法。

 

C、试题说明:

       先将所有的牌都统计起来再判断每一堆牌到底要几张牌(就是求平均数)。

 

从第一组开始只要这一组的牌数不等于这个平均数。

 

就可以将这一堆牌减去平均数。

 

不论正负,正负不影响最优解。

 

将差值移交给下一组处理,同时步数加一。

 

最后将步数输出就是答案。

2、代码

#include<cstdio>

#include<cstring>

#include<iostream>

#include<algorithm>

using namespace std;

 

int n,card[105],ave,step;

 

int main()

{

    scanf("%d",&n);

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

        scanf("%d",&card[i]),ave+=card[i];

 

    ave=ave/n;

 

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

    {

        if(ave==card[i]) continue;

        card[i+1]+=card[i]-ave,step++;

    }

 

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

 

    return 0;

}

 

第2题:字串替换

1、说明

A、试题类型:

       搜索问题。

 

B、算法模型:

       BFS。

 

C、试题说明:

       隐式图搜索,注意的是转移的时候状态u中可能有多处与A$匹配,也就是一个A$可以拓展多个点。

2、代码

#include<iostream>

#include<fstream>

#include<cstdlib>

#include<cstring>

#include<queue>

#include<map>

using namespace std;

 

const int maxn = 1000+10;

 

struct Node

{

       string s;

       int d;

};

 

string block[maxn];

map<string,int> X;

string a[7],b[7];

string A,B;

int n=0;

int pos[maxn];

 

void make_pos(string s,string t)

       pos[0]=1; int lens=s.size(),lent=t.size();

       for(int i=0;i<=lens-lent;i++)

              if(s.substr(i,lent)==t)

                     pos[pos[0]++]=i; 

}

 

void bfs()

{

    queue<Node> q;

    q.push((Node){A,0});

    X[A]=1;

    while(!q.empty())

       {

              Node u=q.front(); q.pop();

              if(u.s==B) { cout<<u.d; return ;

              }

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

              {

                     make_pos(u.s,a[r]);

                     for(int i=1;i<pos[0];i++)

                     {

                            string s=u.s;

                            s.replace(pos[i],a[r].size(),b[r]);

                            if(!X.count(s) && u.d+1<=10)

                            {

                                   X[s]=1;

                                   q.push((Node){s,u.d+1});

                            }

                     }

              }

    }

    cout<<"NO ANSWER!";

}

 

int main()

{

       ios::sync_with_stdio(false);

      

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

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

      

       cin>>A>>B;

      

       while(cin>>a[n]>>b[n])

              n++;

       bfs();

      

       return 0;

}

第3题:自由落体

1、说明

A、试题类型:

       送分问题。

 

B、算法模型:

       物理问题。

 

C、试题说明:

       物理与逻辑的结合。

 

2、代码

#include<bits/stdc++.h>

using namespace std;

 

double h,s,v,l,k;

int n;

double t1,t2;

int s1,s2;

 

int main()

{

       cin>>h>>s>>v>>l>>k>>n;

      

       t1=sqrt((h-k)/5);

       t2=sqrt(h/5);

       s1=s-t1*v+l;

       s2=s-t2*v;

       s1=min(s1,n);//边界

       s2=max(s2,0);//边界

       printf("%d",s1-s2);

      

       return 0;

}

     

 

第4题:矩形覆盖

1、说明

A、试题类型:

       空间几何。

 

B、算法模型:

搜索。剪枝方法应用。

 

C、试题说明:

       将读入的坐标按x和y从小到大排序,然后搜索将连续的i个点分在一起,期间判断问题是否可行,以及进行各种小优化。

 

2、代码

#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cstring>

#include<cmath>

using namespace std;

 

int read()

{

    int x=0,f=1;char ch=getchar();

      

    while(ch<'0' || ch>'9')

       {

              if(ch=='-')f=-1;

              ch=getchar();

       }

      

    while(ch>='0' && ch<='9')

       {

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

              ch=getchar();

       }

      

    return x*f;

}

 

struct point

{

    int x,y;

}a[60];

 

int cmp(point a,point b)

{

    if(a.x==b.x)

              return a.y<b.y;

      

    return a.x<b.x;

}

 

struct block

{

    int x1,y1,x2,y2;

}b[5];

 

int n,k;

int ans=1e9;

 

void DFS(int pos,int cnt,int smm)

{

    if(pos>n)

       {

        ans=min(ans,smm);

        return;

    }

      

    if(cnt>k)

              return;

      

    int i,j;

    b[cnt].x1=a[pos].x;

    b[cnt].x2=a[pos].x;

    b[cnt].y1=a[pos].y;

    b[cnt].y2=a[pos].y;

      

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

       {

        b[cnt].y2=max(b[cnt].y2,a[i].y);

        b[cnt].x2=max(b[cnt].x2,a[i].x);

        b[cnt].x1=min(b[cnt].x1,a[i].x);

        b[cnt].y1=min(b[cnt].y1,a[i].y);

             

        for(j=1;j<cnt;j++)

              {

            if(b[cnt].x1<=b[j].x2 && b[cnt].y1<=b[j].y2)

                            return;

        }

             

        if(i<n && cnt==k)

                     continue;

             

        DFS(i+1,cnt+1,smm+(b[cnt].x2-b[cnt].x1)*(b[cnt].y2-b[cnt].y1));

    }

    return;

}

 

int main()

{

    n=read();k=read();

    int i,j;

      

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

       {

        a[i].y=read();a[i].x=read();

    }

      

    sort(a+1,a+n+1,cmp);

    memset(b,-1,sizeof b);

    DFS(1,1,0);

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

      

    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