C++ 2019省赛

2、猫吃鱼


第10届蓝桥杯C++青少组省赛2019年真题 | 考级竞赛题库

始终记录经过站点买鱼的最小花费,如果当前站点买鱼的价格比最小花费低,就将当前站点买鱼的价格赋值给最小花费,加上总共费用中。然后在去往下个站点的时候,将当前站点的运费算在最小花费中。

#include<iostream>
using namespace std;
int buy[200],yun[200];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>buy[i]>>yun[i];
    }
    int minmoney=1000000,sum=0;//最小的费用,总共的费用 
    for(int i=1;i<=n;i++){
        if(minmoney>buy[i])
            minmoney=buy[i];//最小的买鱼费用 
        sum+=minmoney;
        minmoney+=yun[i];//加上当前的运费 
    }
    cout<<sum;
    return 0;
}


3、评选最佳品牌


#include<iostream>
using namespace std;
string a[2000];
int t[20];
int main(){
    int m,n;
    cin>>m>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    while(1){
        for(int i=1;i<=m;i++){
            if(t[i]>0){
                t[i]=0;
            }
        }
        //计算投票 
        for(int i=1;i<=n;i++){
            string s=a[i];
            for(int j=0;j<s.size();j++){
                int p=s[j]-'0';
                if(p == 0){//0弃票 
                    break;
                }
                else{
                    if(t[p]>=0){//给对应编号投票 
                        t[p]++;
                        break;
                    }
                }
            }
        }
        //通过票数的最小值和最大值是否相等来看是否结束 
        int max=0,min=20000;
        for(int i=1;i<=m;i++){
            if(t[i]>max){
                max=t[i];
            }
            if( t[i]!=-1 && t[i]<min )
                min=t[i];
        }
        int bh,cnt=0;
        if(max==min){//最大值和最小值相等
            for(int i=1;i<=m;i++){//计算最大值的个数 
                if(t[i]==max){
                    cnt++;
                    bh=i;
                }
            }
            if(cnt>1)//最大值多余1个,说明评选失败 
                cout<<'-'<<max;
            else//最大值只有1个,评选成功 
                cout<<bh;
            break;
        }
        else{//最大值最小值不等,则需要进行下一次的评选 
            for(int i=1;i<=m;i++){
                if(t[i]==min){
                    t[i]=-1;
                }
            }
        }
    }
    
    return 0;
}

4、最大购物优惠

#include<iostream>
using namespace std;
int dp[110][110][110];
string s[110][110][110];
int ww[110],vv[110],ll[110];
int main(){
    int w,v,n;
    cin>>w>>v>>n;
    for(int i=1;i<=n;i++){
        cin>>ww[i]>>vv[i]>>ll[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=w;j++){//重量 
            for(int k=1;k<=v;k++){//体积 
                if(j<ww[i] || k<vv[i]){
                    dp[i][j][k]=dp[i-1][j][k];
                    s[i][j][k] = s[i-1][j][k];
                }
                else{
                    int nn = dp[i-1][j-ww[i]][k-vv[i]] + ll[i];
                    int bn = dp[i-1][j][k];
                    if(nn > bn){
                        dp[i][j][k] = nn;
                        s[i][j][k] = s[i-1][j-ww[i]][k-vv[i]] + (char)(i+'0')+" ";
                    }
                    else{
                        dp[i][j][k] = bn;
                        s[i][j][k] = s[i-1][j][k];
                    }
                }
            } 
        }
    }
    cout<<dp[n][w][v]<<endl;
    cout<<s[n][w][v];
    
    return 0;
}

​​
5、蓝桥杯迷宫
​​​

#include<iostream>
using namespace std;
char dt[110][110];
char visit[110][110];
int n,m;
int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};
int step=1,ans=0;

int dfs(int x,int y){
    
    if(dt[x][y] == 'L') visit[x][y]=1;
    
    char next;
    if(dt[x][y] == 'L') next = 'Q';
    if(dt[x][y] == 'Q') next = 'B';
    if(dt[x][y] == 'B') next = 'S';
    if(dt[x][y] == 'S') next = 'L';
    
    for(int i=1;i<=4;i++){
        int xx = x + dx[i];
        int yy = y + dy[i];
//合法的下标,并且是下一个字符,且已经访问过
        if(xx>=1 && yy>=1 && xx<=n && yy<=m && dt[xx][yy]==next && visit[xx][yy])
            return -1;
        else if(xx>=1 && yy>=1 && xx<=n && yy<=m && dt[xx][yy]==next){
            visit[xx][yy]=1;
            step++;
            if( dfs(xx,yy)==-1 ) return -1;//循环了
            visit[xx][yy]=0;//回溯
            if(step/4 > ans) ans=step/4;//计算当前走过几遍
            step-=1;//回溯后步数减1
        }
    }
    return 0;
}

int main(){

    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>dt[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(dt[i][j] == 'L'){
                
                visit[i][j]=0;
                if(dfs(i,j)==-1){
                    ans=-1;//循环了
                    break;
                }
            }
        }
        if(ans==-1)
            break;
    }
    cout<<ans;
    return 0;
}
 

  • 50
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值