首页 > 其他分享 >2019蓝桥杯省赛B组

2019蓝桥杯省赛B组

时间:2024-03-13 21:44:53浏览次数:22  
标签:std int ll s0 namespace long 蓝桥 2019 省赛

2019蓝桥杯省赛B组

A.组队

方法一:人脑计算(每次选最大,但是一个人不能当两个位)

最大值:98+99+98+97+98

法二:枚举

#include<iostream> using namespace std; //每个位置各编号的评分情况 int one[20] = {97, 92, 0, 0, 89, 82, 0, 0, 0, 95, 0, 0, 94, 0, 0, 0, 98, 93, 0, 0}; int two[20] = {90, 85, 0, 0, 83, 86, 0, 97, 0, 99, 0, 0, 91, 83, 0, 0, 83, 87, 0, 99}; int three[20] = {0, 96, 0, 0, 97, 0, 0, 96, 89, 0, 96, 0, 0, 87, 98, 0, 99, 92, 0, 96}; int four[20] = {0, 0, 0, 80, 0, 0, 87, 0, 0, 0, 97, 93, 0, 0, 97, 93, 98, 96, 89, 95}; int five[20] = {0, 0, 93, 86, 0, 0, 90, 0, 0, 0, 0, 98, 0, 0, 98, 86, 81, 98, 92, 81}; int main() { int m=0; //考点:多重for循环遍历且不能选重复!   for(int i=0;i<20;i++){     for(int j=0;j<20;j++){       if(i==j)continue;       for(int k=0;k<20;k++){         if(i==k||j==k)continue;         for(int p=0;p<20;p++){           if(p==i||p==j||p==k)continue;           for(int q=0;q<20;q++){             if(q==i||q==j||q==k||q==p)continue;             m=max(m,one[i]+two[j]+three[k]+four[p]+five[q]);           }         }       }     }   }    cout<<m;     return 0; } 答案:490

B.年号子串

#include <iostream> using namespace std; int main() {   cout<<"BYQ";   // 请在此输入您的代码   return 0; } 分析: 类似于26进制, 权重:个位为26的0次方,十位为26的1次方 然后对于A~Z单个来说为1~26再乘以这一位权重。  答案:BYQ

C.数列求值

//考点:类似斐波拉契数列+取模运算

#include<bits/stdc++.h> using namespace std; typedef long long int ll; const ll N=20191000; ll a[N]; int main(){ a[1]=1; a[2]=1; a[3]=1; for(int i=4;i<=20190324;i++) { a[i]=(a[i-1]+a[i-2]+a[i-3])%10000;//对于只求最后n位数就每次%10的n次方,不能直接求整个数因为数太大所以才让求后几位! } cout<<a[20190324]; return 0; } 答案:4659

D.数的分解

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
ll ans;
bool check(int a){
    while(a){
        if(a%10==2||a%10==4)return true;
        a/=10;
    }
    return false;
}
int main(){
    for(int i=1;i<=2019;i++){
        if(check(i)) continue;
        for(int j=i+1;j<=2019;j++){
            if(check(j))continue;
            for(int p=j+1;p<=2019;p++){
                if(check(p))continue;
                if(i+j+p==2019)ans++;
                
            }
        }
    }
    cout<<ans;
    return 0;
} 答案:40785  

E.迷宫(有问题)

 

 

/* 步数最少用bfs bfs依靠队列 每次取队头,删队头,考虑是否要在队尾插入元素! */ #include <bits/stdc++.h> using namespace std; const int N=55; int a[N][N];//存放地图 int vis[N][N];//vis[i][j]=1是访问过,vis[i][j]=0没访问过 //顺序DLRU下左右上 int dx[4]={1,0,0,-1};//行 int dy[4]={0,-1,1,0};//列 char f[4]={'D','L','R','U'}; struct point{ int x;int y;//当前点坐标(x,y) string ans;//到当前点的最短路径方案值 }; void bfs(){   queue<point>q;   point w;   w.x=1;   w.y=1;   q.push(w);   while(q.size()){     //取队头弹出队头     point r=q.front();       // q.pop();     //打到最后一个点(30,50)     if(r.x==30&&r.y==50){       cout<<r.ans;       return ;     }     //从当前点r往下左右上走!     for(int i=0;i<4;i++){ point t; t.x=r.x+dx[i]; t.y=r.y+dy[i]; t.ans=r.ans+f[i]; //vis是为了防止重复访问这个点这样就不最短,地图上0可以走 if(t.x>=1&&t.x<=30&&t.y>=1&&t.y<=50&&vis[t.x][t.y]==0&&a[t.x][t.y]==0){ vis[t.x][t.y]=1;//访问这个点 q.push(t); }     }     q.pop();   } } int main() {   string s; for(int i=1;i<=30;i++){   cin>>s;   for(int j=1;j<=50;j++){    a[i][j]=s[j-1]-'0';   } }
bfs();   // 请在此输入您的代码   return 0; }

F.特别数的和

考察:筛选

#include<bits/stdc++.h>  using namespace std; typedef long long int ll; ll sum; int n; bool check(int a){   while(a){     int b=a%10;     a/=10;     if(b==2||b==0||b==1||b==9)return true;   }   return false; } int main(){   cin>>n;   for(int i=1;i<=n;i++){     if(check(i))sum+=i;   }   cout<<sum;   return 0; }

G.完全二叉树的权值

考点:暴力枚举

//暴力枚举,因为最多10的5次方个结点那么一层的sum不可能超过10的10次方,所以用long long int  #include<bits/stdc++.h> using namespace std; typedef long long int ll; int main(){ int n;//n个结点 ll sum;//每层的结点权值和 int maxi;//最大权值和的那层下标 ll maxs=-5e5;//先设定一个很小的值,每次看当前层是否要跟新最大权值和 int c=0;//存放当前层次,层次从1开始! int a;//当前结点值 cin>>n; for(int i=1;i<=n;i++){   cin>>a;   if(i==pow(2,c)){//如果是每一层的第一个节点就跟新层次并将本层权值和归为0     sum=0;//当前层权值和归为0     c++;   }   sum+=a;   //一层结束并且本层权值和>maxs就需要更新,注意完全二叉树可能最后一行放不满->此时结束条件i==n   if(sum>maxs&&(i==pow(2,c)-1||i==n)){     maxs=sum;     maxi=c;   } } cout<<maxi;   return 0; }  

H.等差数列

考察算法:最大公公因数gcd

思路:

现将数列从小到大排

然后相邻元素差值计算出来,并且求得差值的最大公因数作为数列的公差

最后根据an=a+(n-1)*d

所求的n=(an-a1)/d+1

#include <bits/stdc++.h> using namespace std; const int N=1e5+6; long long int A[N]; 最大公因数算法:gcd        当b不等于0返回一定要return gcd(b,a%b)否则返回a因为任何数都是0的因数
int gcd(int a, int b) {  return b?gcd(b,a%b):a; } int main() {   int n;   cin>>n;   for(int i=0;i<n;i++)cin>>A[i];   sort(A,A+n);      int d=A[1]-A[0];     if(d==0) {     cout<<n;     return 0;   }   for(int i=2;i<n;i++){     int p=A[i]-A[i-1];     d=gcd(d,p);//最大公因数stl中有内置函数__gcd( ) 注意是两个下划线横gcd()   }   cout<<((A[n-1]-A[0])/d)+1;   // 请在此输入您的代码   return 0; }

I.后缀表达式

思路: 这题考察找规律   我们可以发现:后缀表达式与我们平常写的中缀表达式当二者要表达的意思一样时值一样,并且后缀表达式无括号相当于隐式括号。所以我们将这个问题转化为带括号的中缀最大值问题。   然后我们根据减号个数分类 1.没减号 那最值就是全加起来 2.有减号 就先让最大数减最小数,然后还剩n+m-1个数和n+m-1个符号,那就让他们任意搭配,如果搭配出来是负数就放在刚刚减最小数的括号里,如果是正数就直接加。 所以就是先最大减最小,让后其余全去正数。 完整代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
  int n,m;
  cin>>n>>m;
  int k=n+m+1;
  int a[200010];
  for(int i=0;i<k;i++)cin>>a[i];
  sort(a,a+k);
  long long int res=0;
  if(!m){
for(int i=0;i<k;i++){
  res+=a[i];
}
  }
  else{
    res=a[k-1]-a[0];
    for(int i=1;i<k-1;i++){
      res+=abs(a[i]);
    }
  }
  cout<<res;
  // 请在此输入您的代码
  return 0;
}
注意:数字个数是n+m+1,所以a[ ]的容量要大于200000   

 J.灵能传输

考前缀和+差分+找规律(难)    

 

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 300010;

int n;
LL a[N], s[N];
bool st[N];

int main()
{
    int T;
    scanf("%d", &T);
    while (T -- )
    {

//每一组实验做一次前缀和
        scanf("%d", &n);
        s[0] = 0;
        for (int i = 1; i <= n; i ++ )
        {
            scanf("%lld", &a[i]);
            s[i] = s[i - 1] + a[i];
        }

        LL s0 = s[0], sn = s[n];//边界值
        if (s0 > sn) swap(s0, sn);//为了统一为s0<sn,因为是对称的所以考虑一直情况即可。
        sort(s, s + n + 1);//排序数组,0~n

//现在数列升序

//找寻s0第一次出现的下标值(因为按升序排列数组,原位置可能变动,因为s0可能等于sn,所以s0取前一个,sn取后一个。下面是确定他们的新下标。

        for (int i = 0; i <= n; i ++ )
            if (s[i] == s0)
            {
                s0 = i;
                break;
            }

        for (int i = n; i >= 0; i -- )
            if (s[i] == sn)
            {
                sn = i;
                break;
            }

        memset(st, 0, sizeof st);
        int l = 0, r = n;

//最前面一段
        for (int i = s0; i >= 0; i -= 2)
        {
            a[l ++ ] = s[i];
            st[i] = true;
        }

//最后面一段
        for (int i = sn; i <= n; i += 2)
        {
            a[r -- ] = s[i];
            st[i] = true;
        }

中间段(不重复走)
        for (int i = 0; i <= n; i ++ )
            if (!st[i])
                a[l ++ ] = s[i];

        LL res = 0;
        for (int i = 1; i <= n; i ++ ) res = max(res, abs(a[i] - a[i - 1]));//存放结果准备好,所以最优选项就是当前这么摆,所以只有求相邻前缀和的差即求得当前数字值,然后取max的abs差值!

        printf("%lld\n", res);//结果
    }

    return 0;
}

 

标签:std,int,ll,s0,namespace,long,蓝桥,2019,省赛
From: https://www.cnblogs.com/luckyhappyyaoyao/p/18015963

相关文章

  • [蓝桥杯 2019 省 A] 填空问题 E
    一、题目描述[蓝桥杯2019省A]填空问题ERSA解密二、问题简析本问题可以分成三部分求解:1、求\(p\)和\(q\):利用唯一分解定理,参考P1075[NOIP2012普及组]质因数分解2、求\(e\):利用拓展欧几里得定理,参考P1082[NOIP2012提高组]同余方程和拓展欧几里得算法3、......
  • 洛谷P6866 [COCI2019-2020#5] Emacs
    题目描述给定一个n×m 的只含有 . 和 * 的矩阵。矩阵中 * 形成一些不重叠的长方形。它们不在边缘或顶点接触。求长方形有多少个?输入格式第一行:两个正整数 n 和 m。以下 n 行:表示题目描述中的矩阵。矩阵只含有 . 和 *。输出格式一行一个非负整数,你的答......
  • 【蓝桥杯备赛】Day13:贪心算法(倒计时30天)
    题目1:题目3040:AnEasyProblem给定一个正整数N,求最小的、比N大的正整数M,使得M与N的二进制表示中有相同数目的1。举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案。输入格......
  • [极客大挑战 2019]BuyFlag1
    [极客大挑战2019]BuyFlag1审题菜单有一个home,一个payflag查看payflag中的要求具体有三个要求要有100000000块钱要是CUIT的学生回答正确的密码知识点http消息头的伪造解题抓包查看信息看到user=0,猜测这应该是CUIT的学生的判断条件更改为1。再次查看抓......
  • [RoarCTF 2019]Easy Calc 1
    [RoarCTF2019]EasyCalc1审题题目就是一个计算器。看到源代码有calc.php进入看到waf的源代码知识点RCE解题审核代码<?phperror_reporting(0);if(!isset($_GET['num'])){show_source(__FILE__);}else{$str=$_GET['num'];$blacklist=[......
  • [极客大挑战 2019]PHP 1
    [极客大挑战2019]PHP1审题猜测备份在www.zip中,输入下载文件。知识点反序列化解题查看代码看到index.php中包含了class.php,直接看class.php中的代码查看条件当username=admin,password=100时输出flag构造反序列化输入select中,得到flag。......
  • 文件上传[SUCTF 2019]CheckIn
    文件上传[SUCTF2019]CheckIn打开提交js图片马后台检测文件类型在木马出添加GIF89a绕过显示上传成功的地址uploads/f65a0ca982c669865231909b0ec85a0c上传.user.ini解马关于.user.ini和.htaccess后者有局限性,只能用于apache前者只要能运行php都可用auto_prepend_file......
  • 文件上传例题:[GXYCTF2019]BabyUpload
    文件上传例题:[GXYCTF2019]BabyUpload打开网址明显文件上传上传简单php马尝试后缀名过滤,使用BP抓包进行修改提示文件类型不对,修改成image/jpeg提示还是php,那换成js马<scriptlanguage="php">eval($_POST['cmd']);</script>上传成功解析php代码需要.htaccess文件在文......
  • 十五届蓝桥青少C++组3月评测2024年3月中高级
    STEMA考试C++中高级试卷(24年3月10日)一、选择题(50分)1:(110010)2+(c3)16的结果是()。*选择题严禁使用程序验证,选择题不答或答错都不扣分A.(240)10 B.(11110101)2 C.(366)8 D.(f6)16 备注:此题目下标代表进制,因不支持md格式。 参考答案:B2:表达式1000/3的结果......
  • 201912青少年软件编程(Scratch)等级考试试卷(一级)
    201912青少年软件编程(Scratch)等级考试试卷(一级)第1题:【单选题】关于造型和背景,下面说法不正确的是?A:造型编号从1开始B:有四个背景,删除第二个背景,背景编号为1,3,4C:只有一个背景时,不能删除这个背景D:角色可以有一个或多个造型【正确答案】:B【试题解析】 :第2题:【......