NOIP(第25届)--2019--普及组--复赛--试题与答案(NA25)

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

中小学编程红宝书.zip

关键词:

北京中关村;海淀黄庄;北京大学;清华大学。少儿编程;中小学编程;信息学竞赛;计算机竞赛;NOIP;NOIP竞赛;CSP-J/S竞赛;NOI竞赛。北京中学;东坝。

      2019年、普及组、复赛,第25届。

面向6-18岁中小学生,做最专业的中小学编程教育。

 


解析与答案:

1题:数字游戏

1、说明

A、试题类型:

       字符串问题。

 

B、算法模型:

       基本长度。

 

C、试题说明:

字符串长度固定为8。

读入数据,判断数据是否为1,累计数据。

 

2、代码

#include <cstdio>

 

int main()

{

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

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

 

    char ch;

    int ans = 0;

    while (scanf("%c", &ch)!=EOF)

       {

        if ('1'==ch)

              {

            ans++;

        }

    }

 

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

 

    fclose(stdin);

    fclose(stdout);

 

    return 0;

}

2题:公交换乘

1、说明

A、试题类型:

       基本数据结构。

 

B、算法模型:

       列表。

 

C、试题说明:

列表是一种好的方式。

 

从时间上来看,可能有多个优惠券满足条件,从中选择价格上合适的最早的那个即可。

 

如果时间上不能满足,对于此后的公交出行方式,也不会满足条件。

2、代码

#include<iostream>

#include<list>

 

using namespace std;

 

typedef struct TrafficNumber

{

       int price;

       int startTime;

      

       TrafficNumber(int price, int startTime):price(price),startTime(startTime)

       {

       }

      

}TrafficNumber;

 

int main()

{

       int count;

      

       list<TrafficNumber> coupon;

       cin>>count;

       //总的花费

       int totalCost = 0;

      

       while(count--)

       {

              int type;

              int price;

              int startTime;

              cin>>type>>price>>startTime;

              //坐地铁必须要付钱

              if (type == 0)

              {

                     totalCost += price;

                     coupon.push_back(TrafficNumber(price, startTime));

                    

              }

              else

              {

                     bool findCoupon = false;

                     list<TrafficNumber>::iterator pCoupon;

                     for(pCoupon = coupon.begin(); pCoupon!= coupon.end();)

                     {

                            TrafficNumber trafficNumber = *pCoupon;

                            if(trafficNumber.startTime + 45 < startTime)

                            {

                                   // 已经超时的直接剔除

                                   pCoupon=coupon.erase(pCoupon);

                                   continue;

                            }

                           

                            if (trafficNumber.price>=price)

                            {

                                   // 消费过的优惠券剔除

                                   findCoupon = true;

                                   pCoupon=coupon.erase(pCoupon);

                                   break;

                            }

                           

                            pCoupon++;

                     }

                    

                     if (!findCoupon)

                     {

                            totalCost += price;

                     }

              }

       }

      

       cout<<totalCost<<endl;

       return 0;

}

 

3题:纪念品

1、说明

A、试题类型:

       最有方案。

 

B、算法模型:

       背包问题。

 

C、试题说明:

最优方案可以用完全背包求。价值、体积、容量。

 

物品下一天卖的利润

物品当天的价格

当天持有金币数

 

最优方案可获得的金币数:先知道每一天持有的金币数,再做一遍完全背包求出当天可获得的最大价值,然后用这个最大价值求出下一天持有的金币数,就可求出最后一天持有的金币数,即答案。

2、代码

#include<cmath>

#include<cstdio>

#include<cstring>

#include<iostream>

#include<algorithm>

using namespace std;

 

int n,m,p;

int a[101][101],b[101],h[10001],maxx,an;

bool bz[10001];

 

int main()

{

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

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

      

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

      

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

       {

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

              {

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

              }

       }

      

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

       {

              memset(h,0,sizeof(h));

              memset(bz,0,sizeof(bz));

             

              maxx=0;bz[0]=1;an=p;

             

              if(i==m)

                     continue;

             

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

              {

                     if(a[i+1][j]-a[i][j]<=0)continue;

                     for(int k=0;k<=min(p-a[i][j],maxx);k++)

                     {

                            if(bz[k]==1)

                            {

                                   if(h[k+a[i][j]]<h[k]+(a[i+1][j]-a[i][j]))

                                   {

                                          h[k+a[i][j]]=h[k]+(a[i+1][j]-a[i][j]);

                                          bz[k+a[i][j]]=1;

                                          maxx=max(maxx,k+a[i][j]);

                                   }

                            }

                     }

              }

             

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

              {

                     an=max(an,p+h[j]);

              }

             

              p=an;

       }

       printf("%d",p);

       return 0;

}

4题:加工零件

1、说明

A、试题类型:

       结构与算法。

 

B、算法模型:

       最短路径。

 

C、试题说明:

最短路径与奇偶性。

2、代码

#include<cstdio>

#include<cstring>

using namespace std;

 

const int N=1e5+100;

 

struct node

{

       int x,y,next;

}a[2*N];int len,last[N];

 

void ins(int x,int y)

{

       a[++len].x=x;

       a[len].y=y;

       a[len].next=last[x];

       last[x]=len;

}

 

bool bk[N][2];

int d[2*N][2],f[N][2];

 

int main()

{

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

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

      

       int n,m,q;

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

      

       len=0;

      

       memset(last,0,sizeof(last));

      

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

       {

              int x,y;

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

              ins(x,y);ins(y,x);

       }

      

       int SUM=0;

      

       for(int k=last[1];k;k=a[k].next)

              SUM++;

      

       if(SUM==0)

       {

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

                     printf("No\n");

             

              return 0;

       }

      

       memset(f,60,sizeof(f));

      

       int st=0,ed=1;

      

       d[1][0]=1;

       d[1][1]=0;

       f[1][0]=0;

      

       memset(bk,true,sizeof(bk));

      

       bk[1][0]=false;

      

       while(st<ed)

       {

              st++;

              int x=d[st][0],c=d[st][1];

             

              for(int k=last[x];k;k=a[k].next)

              {

                     int y=a[k].y;

                    

                     if(bk[y][1-c])

                     {

                            f[y][1-c]=f[x][c]+1;

                            bk[y][1-c]=false;

                            d[++ed][0]=y;

                            d[ed][1]=1-c;

                     }

              }

       }

      

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

       {

              int A,L;

              bool pd=false;

             

              scanf("%d%d",&A,&L);

             

              if(L%2==0&&f[A][0]<=L)

                     pd=true;

             

              if(L%2==1&&f[A][1]<=L)

                     pd=true;

             

              if(pd)

                     printf("Yes\n");

             

              else

                     printf("No\n");

       }

      

       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