当前位置: 代码迷 >> 综合 >> 第十届蓝桥杯大赛个人赛省赛(软件类本科B组)做题笔记Partial
  详细解决方案

第十届蓝桥杯大赛个人赛省赛(软件类本科B组)做题笔记Partial

热度:63   发布时间:2024-02-29 11:24:22.0

第十届蓝桥杯大赛个人赛省赛(软件类本科B组)做题笔记Partial

试题A:组队

题目略


Ans=490

解题思路:全排列解题:arr【20】数组,生成5个元素分别赋值为1,2,3,4,5 表示作为首发坑位编号,其余全为0:表示不选择作为首发。
全排列 遍历所有可能的首发阵容:若arr[i]!=0 则选择(i+1) 【因为 i 从 0~19 】号球员 作为 坑位 arr[i] 对应的球员;反之,continue ;得到对应的分值之和,不断比较,求出最大值。

Codes:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int Pnts[20][5]={ {97,90,0,0,0},{92,85,96,0,0},{0,0,0,0,93},{0,0,0,80,86},
    {89,83,97,0,0},{82,86,0,0,0},{0,0,0,87,90},{0,97,96,0,0},
    {0,0,89,0,0},{95,99,0,0,0},{0,0,96,97,0},{0,0,0,93,98},
    {94,91,0,0,0},{0,83,87,0,0},{0,0,98,97,98},{0,0,0,93,86},
    {98,83,99,98,81},{93,87,92,96,98},{0,0,0,89,92},{0,99,96,95,81}
};
int arr[20];
int maxPnt=0;
int player[5];
int res[5];

void check(){
    
    int thisPnt=0;
    for(int i=0;i<5;i++){
        int Plr=player[i];//选手Pos 
        thisPnt+=Pnts[Plr-1][i];
    }
    maxPnt=max(thisPnt,maxPnt);
}

int main(int argc, char** argv) {
    for(int i=0;i<20;i++){
        if(i<5)
            arr[i]=i+1;
        else
            arr[i]=0;
    }

    sort(arr,arr+20);
    
    do{
        for(int i=0;i<20;i++){
            int num=arr[i];
            if(num!=0){
                player[num-1]=i+1;
            }
        }        
        
        check();
        
        
    }while(next_permutation(arr,arr+20));
    cout<<maxPnt<<endl;
    
    return 0;
}

 

试题B:年号子串

题目略

Excel 解题
Ans=BYQ


试题C:数列求值
Ans=4659

Codes:
#include <iostream>

using namespace std;

int A,B,C;
int tmp;

void simplify(int& num){
    if(num>1000000){
        int ws=num/1000000;
        num=num-ws*1000000;
    }
}

void move(){
    tmp=C+B;
    simplify(tmp);
    
    tmp+=A;
    simplify(tmp);
    
    A=B;
    B=C;
    C=tmp;

}


int main(int argc, char** argv) {
    A=3;
    B=5;
    C=9;
    
    for(long long i=7;i<=20190324;i++){
        move();
    }
    cout<<C<<endl;
    
    return 0;
}

 

试题D:数的分解

in thought。。。

 


试题E:迷宫

题目略

一共186步
Ans=DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUUULLLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR

Codes:
#include <iostream>
#include <vector>
#include <string.h>
#include <queue>
#include <stack>

using namespace std;

struct Point{
    int val;
    int X,Y;//Point的坐标:行X,列Y
    int FX,FY;//BFS遍历得到最短路径 上 当前节点的 上一个节点 :行FX,列FY
    int steps;// BFS遍历到当前节点时,走过的步数
    Point(){    }
    Point(int xx,int yy,int fx=0,int fy=0,int stp=0){
        this->X=xx;
        this->Y=yy;
        this->FX=fx;
        this->FY=fy;
        this->steps=stp;
    } 
}G[502][502];//图 

int N,M;//N行,M列
int vis[502][502];
int dir[][2]={ {-1,0},{0,1},{1,0},{0,-1} };//顺时针 四个方向:上、右、下、左 
queue<Point> Q;
char dir2[4]={'U','R','D','L'};
stack<char> way;

void Read(){
    cin>>N;
    string samp;
    for(int i=1;i<=N;i++){
        cin>>samp;
        for(int j=1;j<=samp.size();j++){
            G[i][j].X=i;//初始化每个 坐标 
            G[i][j].Y=j;
            
            G[i][j].val=samp[j-1]-'0';
        }
            
    }
    M=samp.size();
    
    memset(vis,0,sizeof(vis));
}

void PrintG(){
    
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++)
            cout<<G[i][j].val<<" ";
        cout<<endl;
    }
    
}

void moveOn(Point P){
    
    for(int i=0;i<4;i++){
        int toX=P.X+dir[i][0];
        int toY=P.Y+dir[i][1];
        
        if(toX>=1 && toX<=N && toY>=1 && toY<=M && vis[toX][toY]==0 && G[toX][toY].val==0 ){
            
            vis[toX][toY]=1;
            Point tmp(toX,toY,P.X,P.Y,P.steps+1);
            G[toX][toY]=tmp;
            Q.push(G[toX][toY]);
        }        
    }            
}

Point BFS(Point S){
    vis[S.X][S.Y]=1;
    Q.push(S);
    
    while(!Q.empty()){
        Point V=Q.front();
        Q.pop();
        if(V.X==N && V.Y==M)
            return V;
        
        moveOn(V);
    }
}

char getDir(Point P){//=> 当前节点的上一个节点  相对于 当前节点的方向     
    for(int i=0;i<4;i++){
        if(P.FX+dir[i][0]==P.X && P.FY+dir[i][1]==P.Y){
            return dir2[i];
        }
    }    
    return 'X';
}

int main(int argc, char** argv) {
    Read();
//    PrintG();
    
    G[1][1].steps=0;
    Point Final=BFS(G[1][1]);
    
    cout<<"Final.steps: "<<Final.steps<<endl;
    
    Point tmp=Final;
    while( !(tmp.X==1 && tmp.Y==1) ){
        way.push(getDir(tmp));
        tmp=G[tmp.FX][tmp.FY];
    }
    
    while(!way.empty()){
        char c=way.top();
        cout<<c;
        way.pop();
    }

    return 0;
}

 

试题F:特别数的和

题目略

Codes:
#include <iostream>
#include <sstream>
#include <string.h>

using namespace std;

int n;//n<=10000

//数字中 包含 2、0 、1、9 的 
string ItoS(int x){
    ostringstream is;
    is<<x;
    return is.str();
}

bool check(int num){
    string sn=ItoS(num);
    int len=sn.size();
    for(int i=0;i<len;i++){
        if(sn[i]=='2' || sn[i]=='0' || sn[i]=='1' || sn[i]=='9')
            return true;
    }
    return false;
}

int main(int argc, char** argv) {
    cin>>n;
    
    long long sum=0;
    for(int i=1;i<=n;i++){
        if(check(i))
            sum+=i;
    }

    cout<<sum<<endl;

    return 0;
}

 

试题G:完全二叉树的权值

题目略

Codes:
#include <iostream>
#include <cmath>

using namespace std;


//深度为k的二叉树,最多有节点 2^k -1 个 
int tree[100006];
int n;

int level(int nodes){
    return ceil( log(nodes+1)/log(2) );    
}

int KthTotalNodes(int lvl){
    return pow(2,lvl)-1;
}

int main(int argc, char** argv) {
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>tree[i];
    
    
    int lvl=level(n);
    int amt[lvl+1];
    for(int i=1;i<=lvl;i++){//完全二叉树 ,每层最多2^(k-1)个 节点  
        if(i<lvl){
            for(int j=KthTotalNodes(i)+1;j<=pow(2,i-1)+KthTotalNodes(i);j++){
                amt[i]+=tree[j];
            }
        }
        else{
            for(int j=KthTotalNodes(i)+1;j<=n;j++){//最后一层 
                amt[i]+=tree[j];
            }
        }
    }

    int thismax=0;
    int pos=-1;
    for(int i=1;i<=lvl;i++){
        if(amt[i]>thismax){
            thismax=amt[i];
            pos=i;
        }
    }
    cout<<pos<<endl;

    return 0;
}

 

试题H:等差数列

题目略

Codes:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long LL;
LL N;
vector<LL> arr;
LL mind=1e9;//最小公差 

int main(int argc, char** argv) {
    cin>>N;
    for(LL i=0;i<N;i++){
        LL x;
        cin>>x;
        arr.push_back(x);
    }
    sort(arr.begin(),arr.end());    
    
    for(LL i=1;i<N;i++){
        LL thisd=arr[i]-arr[i-1];
        mind=min(mind,thisd);
    }
    
    LL cnt=0;
    for(LL i=arr[0];;i+=mind){
        cnt++;
        
        if(i==arr[N-1])
            break;
    }

    cout<<cnt<<endl;

    return 0;
}

 

试题I:后缀表达式

题目略

Codes:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long LL;
LL N,M;//N各加号,M个减号,以及N+M+1个整数 
vector<LL> arr;

int main(int argc, char** argv) {
    cin>>N>>M;
    
    for(int i=1;i<=N+M+1;i++){
        LL x;
        cin>>x;
        arr.push_back(x);
    }

    sort(arr.begin(),arr.end());
    
    LL sum=0;
    LL cnt=-1;
    for(LL i=arr.size()-1;i>=0;i--){
        sum+=arr[i];
        cnt++;
        if(cnt==N)
            break;    
    }
    
    for(LL i=0;i<M;i++){
        sum-=arr[i];
    }
    
    cout<<sum<<endl;

    return 0;
}