NOIP(第26届)--2020--普及组--复赛--试题与答案(NA26)

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

中小学编程红宝书.zip

关键词:

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

      2020年,普及组、复赛,第26届。

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



解析与答案:

 


1题:优秀的拆分(power)

1、说明

A、试题类型:

       推理模拟。

 

B、算法模型:

       模拟。

 

C、试题说明:

       无。

 

2、代码

#include<cstdio>

 

#define Fu(i,a,b) for(int i=(a);i<=(b);i++)

#define Fd(i,a,b) for(int i=(a);i>=(b);i--)

#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)

 

int n,w,a[100005],ji,t[700];

 

int max(int x,int y)

{

       if(x>y)

              return x;

       return y;

}

 

int main()

{

       fre(live);

       scanf("%d%d",&n,&w);

 

       Fu(i,1,n)a[i]=max(i*w/100,1);

 

       Fu(i,1,n)

       {

              scanf("%d",&ji);

              t[ji]++;

              int num=0;

 

              Fd(j,600,0)

              {

                     num+=t[j];

                     if(num>=a[i])

                     {

                            printf("%d ",j);

                            break;

                     }

              }

       }

 

       fclose(stdin);

       fclose(stdout);

 

       return 0;

}

2题:直播获奖(live)

1、说明

 

A、试题类型:

       基本数学问题。

 

B、算法模型:

       奇偶数。

 

C、试题说明:

给出一个n,奇数输出-1,偶数输出二进制拆分。

 

模拟即可(偶数可以从2 2231到2 221枚举,能减就减,输出)。

2、代码

#include<cstdio>

 

#define Fu(i,a,b) for(int i=(a);i<=(b);i++)

#define Fd(i,a,b) for(int i=(a);i>=(b);i--)

#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)

 

int n,w,a[100005],ji,t[700];

 

int max(int x,int y)

{

       if(x>y)

              return x;

 

       return y;

}

 

int main()

{

       fre(live);

 

       scanf("%d%d",&n,&w);

       Fu(i,1,n)a[i]=max(i*w/100,1);

 

       Fu(i,1,n)

       {

              scanf("%d",&ji);

              t[ji]++;

              int num=0;

 

              Fd(j,600,0)

              {

                     num+=t[j];

                     if(num>=a[i])

                     {

                            printf("%d ",j);

                            break;

                     }

              }

       }

 

       fclose(stdin);

       fclose(stdout);

 

       return 0;

}

3题:表达式(expr)

1、说明

A、试题类型:

       经典问题。

 

B、算法模型:

       表达式。

 

C、试题说明:

       无。

 

2、代码

//!(a&b)=!a|!b

//!(a|b)=!a&!b

#include<stdio.h>

#include<iostream>

#include<stack>

using namespace std;

 

const int maxn=2000000+10;

int w[maxn],tree[maxn][2],xr[maxn],a[maxn];

int tot,n;

 

int DFS(int u,int f)

{

       a[u]^=f;

       if(u<=n) return a[u];

       int x=DFS(tree[u][0],f^xr[tree[u][0]]);

       int y=DFS(tree[u][1],f^xr[tree[u][1]]);

 

       if(a[u]==3)

       {//0&v=0

              if(x==0) w[tree[u][1]]=1;

              if(y==0) w[tree[u][0]]=1;

              return x&y;

       }

       else

       {//1|v=1

              if(x==1) w[tree[u][1]]=1;

              if(y==1) w[tree[u][0]]=1;

              return x|y;

       }

}

 

void push(int u)

{

       if(u<=n)

              return;

      

       w[tree[u][0]]|=w[u];

       w[tree[u][1]]|=w[u];

       push(tree[u][0]);

       push(tree[u][1]);

}

 

int main()

{

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

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

      

       string s;

       getline(cin,s);

       cin>>n;

       tot=n;   

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

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

 

       stack<int>b;

 

       int len=s.size();

      

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

       {

              if(s[i]=='x')

              {

                     int num=0;

                     i++;//x125

                     while(s[i]!=' ')

                     {

                            num=num*10+s[i]-'0';

                            i++;

                     }

                     b.push(num);

              }

             

              else if(s[i]=='&')

              {

                     int y=b.top();b.pop();

                     int x=b.top();b.pop();

                     tot++;

                     b.push(tot);

                     a[tot]=3;

                     tree[tot][0]=x;

                     tree[tot][1]=y;

              }

              else if(s[i]=='|')

              {

                     int y=b.top();b.pop();

                     int x=b.top();b.pop();

                     tot++;

                     b.push(tot);

                     a[tot]=2;

                     tree[tot][0]=x;

                     tree[tot][1]=y;

              }

              else if(s[i]=='!')

                     xr[b.top()]^=1;

       }

      

       int ans=DFS(tot,xr[tot]);

       push(tot);

       int q;

       cin>>q;

      

       while(q--)

       {

              int u;

              scanf("%d",&u);

              if(w[u]) printf("%d\n",ans);

              else printf("%d\n",1-ans);

       }

      

       return 0;

}

4题:方格取数(number)

1、说明

 

A、试题类型:

       空间问题。

 

B、算法模型:

       DP。

 

C、试题说明:

DP,但正常的DP做这道题不能向上走,所以考虑分类讨论:

从左边来的(i,j)的最大权值和为left  i,j ;

从上边来的(i,j)的最大权值和为up i,j ;

从下边来的(i,j)的最大权值和为down i,j 。

 

DP显而易见:

 

left可以从left,up,down更新;

up可以从left,up更新;

down可以从left,down更新;

注意顺序。

 

2、代码

#include<cstdio>

#define Fu(i,a,b) for(int i=(a);i<=(b);i++)

#define Fd(i,a,b) for(int i=(a);i>=(b);i--)

#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)

#define INF 11999999999

 

long long n,m,a[1005][1005],up[1005][1005],down[1005][1005],left[1005][1005];//不开long long见祖宗

 

long long max(long long x,long long y)

{

       if(x>y)

              return x;

 

       return y;

}

 

int main()

{

       fre(number);

       scanf("%lld%lld",&n,&m);

 

       Fu(i,1,n)Fu(j,1,m)

       {

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

              up[i][j]=down[i][j]=left[i][j]=-INF;

       }

 

       up[1][1]=down[1][1]=left[1][1]=a[1][1];

 

       Fu(j,1,m)

       {

              Fu(i,1,n)

              {//先转移up和left

                     if(i!=1) up[i][j]=max(up[i-1][j],left[i-1][j])+a[i][j];

                     if(j!=1) left[i][j]=max(left[i][j-1],max(up[i][j-1],down[i][j-1]))+a[i][j];

              }

 

              Fd(i,n-1,1)down[i][j]=max(down[i+1][j],left[i+1][j])+a[i][j];

       }

 

       printf("%lld",max(up[n][m],left[n][m]));

 

       fclose(stdin);

       fclose(stdout);

 

       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