2020第十一届蓝桥杯国赛B组C/C++个人题解+源代码

先存个样~~之后补全
具体移至博客这个文章<<<---点击查看后应该对你有帮助
这是我的写法,有什么建议或者更好的方法,或者错了可以告诉我。。

A:美丽的 2


思路:直接1-2020枚举判断

int main(){
    int tot=0;
    for(int i=1;i<=2020;i++){
        int k=i;
        while(k){
            int g=k%10;
            k/=10;
            if(g==2){tot++;break;}
        }
    }
    cout<<tot<<endl;
  return 0;
}

答案:563

B:扩散


思路:bfs跑,,然后时间在2020内都记录,边记录边累计个数,每个加个2100,从0开始,一分钟向上扩散1,最多不超过2100

struct node{
    int x;
    int y;
    int t;
};
int da[4][2]={1,0,-1,0,0,-1,0,1};
int n=2100;
int ma[10000][10000],vis[10000][10000];
queue<node> q;
void bfs(){
    mem(ma,0);
    mem(vis,0);
    node s,p;
    p.t=0,p.x=n,p.y=n;q.push(p);
    p.t=0,p.x=n+2000,p.y=n+2000;q.push(p);
    p.t=0,p.x=n+2020,p.y=n+11;q.push(p);
    p.t=0,p.x=n+11,p.y=n+14;q.push(p);
    vis[n][n]=vis[n+2000][n+2000]=vis[n+2020][n+11]=vis[n+11][n+14]=1;
    ll ans=4;
    while(!q.empty()){
        p=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            s.x=p.x+da[i][0];
            s.y=p.y+da[i][1];
            s.t=p.t+1;
            if(vis[s.x][s.y]==0&&s.t<=2020){
                vis[s.x][s.y]=1;
                ans++;
                q.push(s);
            }
        }
    }
    cout<<ans<<endl;
}
int main(){
    bfs();
    return 0;
}

答案:20312088

C阶层约数


答案:39001250856960000

D:本质上升序列


思路:计算每个子序列,我先转化成数字了
代码:

ull ma[250],dp[250];
int main(){
    mem(dp,0);
    for(int i=0;i<250;i++)dp[i]=1;
    string ch;
    cin>>ch;
    cout<<ch.length()<<endl;
    for(int i=0;i<ch.length();i++){
        ma[i]=ch[i]-'a';
    }
    for(int i=0;i<ch.length();i++){
        for(int j=0;j<i;j++){
            if(ma[i]>ma[j])dp[i]+=dp[j];
        }
    }
    ull ans=0;
    for(int i=0;i<ch.length();i++){
        ans+=dp[i];
    }
    cout<<ans<<endl;
    return 0;
}

答案:2472673705(怎么感觉错了,好多人是:3616159)

题 E: 玩具蛇


思路:dfs各个找一遍,实话说,这题好像比前面简单。。

ll tot=0,n=4;
int ma[5][5];
int da[4][2]={-1,0,1,0,0,-1,0,1};
void dfs(int i,int j,int k){
    if(!ma[i][j]&&k==n*n){
        tot++;
        return ;
    }
    ma[i][j]=k;
    for(int e=0;e<4;e++){
        int dx=i+da[e][0];
        int dy=j+da[e][1];
        if(dx>=1&&dy>=1&&dy<=n&&dx<=n&&!ma[dx][dy]){
            dfs(dx,dy,k+1);
        }
    }
    ma[i][j]=0;
}
int main(){
    mem(ma,0);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            dfs(i,j,1);
            cout<<tot<<endl;
        }
    cout<<tot<<endl;
    return 0;
}

答案:552

F: 皮亚诺曲线距离




代码:没写出来。。

G: 游园安排



思路:排个顺序,比较字母个数,小字母多的放前面,一样多的,小字母靠前放前面
(不敢保证完全对)代码:

string x[1000001];
bool cmp(const string a,const string b){
    int visa[30],visb[30];
    mem(visa,0);
    mem(visb,0);
    visa[a[0]-'A']++;
    visb[b[0]-'A']++;
    for(int i=1;i<a.length();i++)
        visa[a[i]-'a']++;
    for(int i=1;i<b.length();i++)
        visb[b[i]-'a']++;
    int mn=min(a.length(),b.length());
    for(int i=0;i<mn;i++){
        if(visa[i]>visb[i])return 1;
        else if(visa[i]<visb[i])return 0;
    }
    if(a.length()>b.length())return 0;
    else if(a.length()<b.length()) return 1;
    else{
        for(int i=0;i<mn;i++)
            if(a[i]>b[i])return 0;
            else if(a[i]<b[i])return 1;
        return 1;
    }
}
int main(){
    int n=-1;
    string ch;
    cin>>ch;
    int i=0;
    while(i<=ch.length()){
        if(ch[i]>='A'&&ch[i]<='Z'){
            n++;
            x[n]+=(ch[i]);
        }
        else if(ch[i]!='\0') x[n]+=ch[i];
        i++;
    }
    n++;
    sort(x,x+n,cmp);
    for(int i=0;i<=n/2;i++)cout<<x[i];
    cout<<endl;
    return 0;
}

H: 答疑



思路:s+e+a小的放前面,一样的就把s+a小的放前面
(不保证完全对)代码:

struct student{
    ll s,a,e;
};
student stu[1001];
bool cmp(const student n1,const student n2){
    /*ll sum1=n1.a+n1.e+n1.s+n2.a+n2.s;
    ll sum2=n2.a+n2.e+n2.s+n1.a+n1.s;
    if(sum1==sum2)return n1.a+n1.s<n2.a+n2.s;
    return sum1<sum2;
    */
    ll sum1=n1.s+n1.a,sum2=n2.s+n2.a;
    if(sum1+n1.e>sum2+n2.e)return 0;
    else if(sum1+n1.e<sum2+n2.e)return 1;
    else{
        if(sum1>sum2)return 0;
        else if(sum1<sum2)return 1;
        else return 1;
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>stu[i].s>>stu[i].a>>stu[i].e;
    }
    sort(stu,stu+n,cmp);
    ll ans=0,k=0;
    for(int i=0;i<n;i++){
        //cout<<stu[i].s<<" "<<stu[i].a<<" "<<stu[i].e<<endl;
        k=k+stu[i].s+stu[i].a;
        ans+=k;
        //cout<<k<<endl;
        k+=stu[i].e;
    }
    cout<<ans<<endl;
    return 0;
}

I: 出租车

J: 质数行者

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容