NOIP(第06届)--2000--普及组--复赛--试题与答案(NA06)

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

中小学编程红宝书.zip


关键词:

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

      2000年、普及组、复赛,第6届。

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



解析与答案:

1、说明

A、试题类型:

       公式推算。

 

B、算法模型:   

       无。

 

C、试题说明:

       未知数的值=常数和/系数和。

2、代码

#include<stdio.h>

#include<string.h>

#include<algorithm>

using namespace std;

 

 

int main()

{

       char c,id;

       int a = 0,b = 0,num = 0,op = 1,dir = 1;

       //a是未知数的系数,b是常数的系数,最终变成的形式是ax + b = 0;

       while((c=getchar())!=EOF)

       {

              if ('a'<=c && c<='z')

              {

                     id = c;

                     if (num==0) num = 1;

                     a += dir * op * num;

                     num = 0;

              }

              else if ('0'<=c && c<='9')

              {

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

              }

              else

              {

                     b += dir * op * num;

                     op = 1;

                     num = 0;

                     if (c=='-')

                            op = -1;

                     if (c=='=')

                            dir = -1;

              }

       }

       printf("%c=%.3f\n",id,-(float)b/a);

       return 0;

}

   

 

 

 

 

2题:税后与补贴问题

1、说明

A、试题类型:

       多不等式问题。

 

B、算法模型:

       范围模型。

 

C、试题说明:   

设一个未知数x,然后对于每个可能的定价列不等式,所有不等式都要求使政府预算的价格的总利润大于其他价格的总利润,解出x范围,范围内找绝对值最小的那个输出。

 

例如:

(31-28+x)*110>=(28-28+x)*130

(31-28+x)*110>=(29-28+x)*125

(31-28+x)*110>=(30-28+x)*120

(31-28+x)*110>=(32-28+x)*95

 

读入数据后,根据已知信息,利用线性关系处理出每个定价对应的销量。

 

解不等式,求x的取值范围。

2、代码

#include<iostream>

#include<algorithm>

#include<cstring>

#include<cstdio>

#include<cmath>

using namespace std;

 

 

const int mxn=12000;

int tar;

int w[mxn],a[mxn];//成本,销售量

int m,v;

 

 

int main()

{

       scanf("%d",&tar);

       int i,j;

       m=1;

       int nw,na,lw,la;

       scanf("%d%d",&w[1],&a[1]);  //成本 销售量

       while(1)

       {

              scanf("%d%d",&nw,&na);

              if(nw==-1 && na==-1)break;

              lw=w[m];la=a[m];

              while(w[m]<nw)

              {          //因为w连续是线性的 从 w【1】开始递增+1计算  

                     m++;

                     w[m]=w[m-1]+1;

                     a[m]=a[m-1]-(la-na)/(nw-lw);

              }

       }      

       scanf("%d",&v);

       while(a[m]-v>0)

       {           //最高价格 开始递减

              m++;

              w[m]=w[m-1]+1;

              a[m]=a[m-1]-v;

       }

    //    for(i=1;i<=m;i++)printf("%d  %d\n",w[i],a[i]);//

 

       int pos=0;

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

              if(w[i]==tar)

              {

                     pos=i;break;

              }  //记录政府价格的位置

 

       if(!pos)

       {

              printf("NO SOLUTION\n");

              return 0;

       }

 

       double mx=1e8,mini=-1e8;

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

       {

              double x=( (double)((w[pos]-w[1])*a[pos]-(w[i]-w[1])*a[i])/(double)(a[i]-a[pos]));

              mx=min(x,mx);

       }  //收税

 

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

       {

              double x=( (double)((w[i]-w[1])*a[i]-(w[pos]-w[1])*a[pos])/(double)(a[pos]-a[i]));

              mini=max(mini,x);

       }//补贴

 

       if(mini>mx)

       {

              printf("NO SOLUTION\n");

       }

       else if(mini>0)

       {

      

              printf("%.0f\n",ceil(mini));

       }

       else if(mx<0)

       {

              printf("%.0f\n",floor(mx));

       }

       else

       {

              printf("0\n");

       }     

       return 0;

}

 

   

 

 

3题:乘积最大

1、说明

A、试题类型:

       数字问题。

 

B、算法模型:

       状态转移方程:dp[i][j]=max(dp[k][j-1]*data[k+1][i], dp[i][j]);

 

C、试题说明:   

dp[i][j]表示从第0个数字到第i个数字中插入j个乘号时得到的最大值,如果比之前的值更大,则更新dp值,dp的初值为0,其中dp[i][0]=data[0][i], data[i][j]表示截取第i个数字到第j个数字所得到的数值。

 

dp[k][j-1]*data[k+1][i]表示在第k个数字和第k+1个数字之间插入一个乘号时的最大值(对插入位置进行遍历得到最大时的K)。

 

 

2、代码

#include<stdio.h>

#include<iostream>

#include<string.h>

using namespace std;

 

int max(int a, int b)

{

       return a>b?a:b;

}

 

int main()

{

       int M, N;

       cin>>M>>N;//M是乘号个数, N是字符串长度

       char str[N+1];

       cin>>str;

       int dp[N+1][M+1];

       int data[N+1][N+1];

       memset(dp, 0, sizeof(dp));

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

       {

              int jojo=0;

              for(int j=i;j<N;j++)

              {

                     jojo=jojo*10+str[j]-'0';

                     data[i][j]=jojo;

              }

       }

      

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

       {

              dp[i][0]=data[0][i];

       }

      

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

       {

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

              {

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

                     {

                            dp[i][j]=max(dp[k][j-1]*data[k+1][i], dp[i][j]);

                     }

              }

       }

      

       cout<<dp[N-1][M];

}

 

4题:单词接龙

1、说明

A、试题类型:

       生活问题。

 

B、算法模型:

       DFS。

 

C、试题说明:

       3层循环算出两个单词接上的长度,然后DFS求最长路即可。

 

注意重合部分可以随意取。

2、代码

 

#include <iostream>

#include <cstring>

#include <cstdio>

 

using namespace std;

 

const int N = 25;

int n;

char start;

string word[N];

int g[N][N];

int used[N];

int ans;

 

void DFS(string dragon, int last)

{

       ans = max(ans,(int)dragon.size());

      

       used[last] ++ ;

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

              if(g[last][i] && used[i] < 2)

                     DFS(dragon + word[i].substr(g[last][i]), i);

        used[last] -- ;

}

 

int main()

{

       cin >> n;

       for(int i = 0; i < n; i ++ ) cin >> word[i];

       cin >> start;

      

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

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

              {

                     string a = word[i], b = word[j];

                     for(int k = 1; k < min(a.size(), b.size()); k ++ )

                     {

                            if(a.substr(a.size() - k, k) == b.substr(0, k))

                            {

                                   g[i][j] = k;

                                   break;

                            }

                     }

              }

       

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

            if(word[i][0] == start)

                DFS(word[i], i);

                    

                     cout << ans << endl;

                     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