22年蓝桥杯真题演练C++

一、刷题统计

    1、题目:

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目,周六和周日每天 b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?
【输入格式】输入一行包含三个整数 a , b 和 n .
【输出格式】输出一个整数代表天数。

    2、代码:

#include <iostream>

using namespace std;

signed main()

{

  int a,b,n;

  cin>>a>>b>>n;

  int count=0;

  int e=n/(5*a+2*b);

  int f=n%(5*a+2*b);

  if(f<=a){

    count=7*e+1;

  }

  else if(f>a&&f<=2*a){

    count=7*a+2;

  }

  else if(f>2*a&&f<=3*a){

    count=7*e+3;

  }

  else if(f>3*a&&f<=4*a){

    count=7*e+4;

  }

  else if(f>4*a&&f<=5*a){

    count=7*e+5;

  }

  else if(f>5*a&&f<=(5*a+b)){

    count=7*e+6;

  }

  else if(f>(5*a+b)&&f<(5*a+2*b)){

    count=8*e;

  }

  cout<<count;

  return 0;

}

二、修剪灌木

    1、题目:

爱丽丝要完成一项修剪灌木的工作。
有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为0厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。灌木每天从早上到傍晚会长高1厘米,而其余时间不会长高。在第一天的早晨,所有灌木的高度都是0厘米。爱丽丝想知道每棵灌木最高长到多高。
【输入格式】一个正整数 N ,含义如题面所述。
【输出格式】输出 N 行,每行一个整数,第行表示从左到右第 i 棵树最高能长到多高。
 

    2、代码:

#include <iostream>

using namespace std;

signed main()

{

  int n;

  cin>>n;

  int a[1005];

  if(n==1){

    cout<<1;

    return 0;

  }

  int height=(n-1)*2;

  int left=1;

  int right=n;

  while(left<right){

    a[left]=a[right]=height;

    left++;

    right--;

    height-=2;

  }

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

    cout<<a[i]<<endl;

  }

  return 0;

}

三、X进制减法

    1、题目:

x 进制减法
进制规定了数字在数位上逢几进一。
 X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则 X 进制数321转换为十进制数为65。
现在有两个 X 进制表示的整数 A 和 B ,但是其具体每一数位的进制还不确定,只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进制。请你算出 A - B 的结果最小可能是多少。
请注意,你需要保证 A 和 B 在 X 进制下都是合法的,即每一数位上的数字要小于其进制。
输入格式
第一行一个正整数 N ,含义如题面所述。
第二行一个正整数 MQ ,表示 X 进制数 A 的位数。
第三行 Mq 个用空格分开的整数,表示 X 进制数 A 按从高位到低位顺序各个数位上的数字在十进制下的表示。
第四行一个正整数 Mb ,表示 X 进制数 B 的位数。
第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各个数位上的数字在十进制下的表示。
请注意,输中的所有数字都是十进制的。
 

2、代码

#include <iostream>

#define MOD 100000007;

using namespace std;

const int N=1e5+5;

int numsA[N],numsB[N];

int main()

{

  int maxN,n,m;

  cin>>maxN>>n;

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

    cin>>numsA[i];

  }

  cin>>m;

  for(int j=m-1;j>=0;j--){

    cin>>numsB[j];

  }

  long long ret=0,base=1;

  int weight;

  for(int i=0;i<max(m,n);i++){

    weight=max(max(numsA[i],numsB[i])+1,2);

    ret=(ret+(numsA[i]-numsB[i])*base)%MOD;

    base=(base*weight)%MOD;

  }

  cout<<ret;

  return 0;

}

四、李白打酒加强版

    1、题目:

话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒显,从家里出来,酒显中有酒2斗。他边走边唱:
无事街上走,提显去打酒。逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店 N 次,遇到花 M 次。已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白这﹣路遇到店和花的顺序,有多少种不同的可能?
注意:显里没酒(0斗)时遇店是合法的,加倍后还是没酒;但是没酒时遇花是不合法的。
输入格式
第一行包含两个整数 N 和 M .
输出格式
输出一个整数表示答案。由于答案可能很大,输出模1000000007的结果。
 

   2、代码

#include <iostream>

#include<cstring>

#include<algorithm>

using namespace std;

const int N=105,mod=1000000007;

int n,m,res;

long long f[2*N][N][N];

signed main(){

  cin>>n>>m;

  f[0][0][2]=1;

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

    for(int j=0;j<=m;j++){

      for(int k=0;k<=m;k++){

        if(i&&k%2==0){

          f[i][j][k]=(f[i-1][j][k/2]+f[i][j][k])%mod;

        }

        if(j&&k>0){

          f[i][j][k]=(f[i][j-1][k+1]+f[i][j][k])%mod;

        }

      }

    }

  }

  cout<<f[n][m-1][1];

  return 0;

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值