2024.09.07米哈游

1.

给定两个正整数n,m,米小游想要求出n-m中的所有整数的哪个数字中4的数量加上 6 的数量最多。
如果有多个这样的数字,请输出最大的。例如某一个数字是 44624,则它有3个4,1个6,所以4和6的数量之和为 4。

打卡题
int main(int argc, char *argv[]) {
    int n,m;
    cin>>n>>m;
    int res = 0;
    int ans = n;
    for(int i=n;i<=m;i++){
        int cur = i;
        int cnt = 0;
        while(cur){
            int num = cur%10;
            if(num==4||num==6) cnt++;
            cur/=10;
        }
        if(cnt>=res){
            res = cnt;
            ans = i;
        }
    }
    cout<<ans<<endl;
    return 0;
}

2. 英桀挑战

米小游正在挑战往事乐土,往事乐土中有n个关卡,m位英桀,挑战完每个关卡后可以在三位不同英桀给出的奖励中选择一个,每个奖励的能力值为,来源为第位英桀。
若米小游至少获得了三个来源为同一位英桀的奖励,她可以获得来自这位英桀的额外奖励,能力值为。米小游想知道,她挑战完这n个关卡最多可以获得多少能力值?

回溯递归
int main(int argc, char *argv[]) {
    int n,m;//关卡数量n,英雄数量m
    cin>>n>>m;
    vector<int> c(m+1);//英雄额外奖励
    for(int i=1;i<=m;i++)
        cin>>c[i];
    vector<vector<int>> a(n,vector<int>(3));
    vector<vector<int>> b(n,vector<int>(3));
    for(int i=0;i<n;i++){
        cin>>a[i][0]>>a[i][1]>>a[i][2];
        cin>>b[i][0]>>b[i][1]>>b[i][2];
    }
    int res = 0;
    vector<int> cnt(m+1);//对m个英雄计数
    //也就是说每一个关卡,有三个选择,这里可以直接回溯选择
    function<void(int,int)> f = [&](int idx,int sum)->void{
        if(idx==n){//遍历完门进行结算
            for(int i=1;i<=m;i++){
                if(cnt[i]>=3) sum+=c[i];
            }
            res = max(res,sum);
            return;
        }
        for(int i=0;i<3;i++){//对三个英雄进行选择
            cnt[b[idx][i]]++;
            f(idx+1,sum+a[idx][i]);
            cnt[b[idx][i]]--;
        }
    };
    f(0,0);
    cout<<res<<endl;
    return 0;
}

3. 点燃心海

米小游和流莹到达了一个被红色海洋包裹着的星球,星球上有一些陆地,流萤准备点燃其中一片大海。具体来说,就是在一张二维地图上,分成了n*m 个格子,
每个格子的类型要么是大海,要么是陆地。若相邻(通过格子的边相邻)两个格子的类型相同,则视为同一个连通块。
大海被点燃后会变成陆地,点燃一片大海就是把一个大海连通块变成一个陆地连通块。米小游想知道在流萤最多点燃一片大海后,最大陆地连通块大小的最大值是多少。

递归搜索同时采用并查集思维标区域号,先搜索海洋,再搜索陆地
搜索时候记录对应连通序号的数目,同时搜索陆地时,将序号放入其连通的海洋里,方便直接计算总和

int main(int argc, char *argv[]) {
    int m,n;
    cin>>m>>n;
    vector<vector<char>> grid(m,vector<char>(n));
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            cin>>grid[i][j];
    vector<vector<int>> flag(m,vector<int>(n,-1));
    unordered_map<int,int> mp;//记录对应连续域格子数目
    unordered_map<int,unordered_set<int>> connect;//记录与对应海域连通的陆地
    //先找海域
    int idx = 0;
    int dir[4][2] = {{1,0},{0,-1},{-1,0},{0,1}};
    function<void(int,int,int)> dfs = [&](int x,int y,int id){
        mp[id]++;//所属区域格子数目增加
        flag[x][y] = id;
        for(int i=0;i<4;i++){
            int nx = x + dir[i][0];
            int ny = y + dir[i][1];
            if(nx<0||ny<0||nx==m||ny==n) continue;
            if(grid[x][y]=='#'&&grid[nx][ny]=='.') connect[flag[nx][ny]].insert(id);
            if(grid[nx][ny]!=grid[x][y]||flag[nx][ny]!=-1) continue;//不相同或者遍历过
            dfs(nx,ny,id);
        }
    };
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++){
            if(grid[i][j]=='.'&&flag[i][j]==-1)
                dfs(i,j,idx++);
        }
    int oceannum = idx;//海洋数目
    //再找陆地
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++){
            if(grid[i][j]=='#'&&flag[i][j]==-1)
                dfs(i,j,idx++);
        }
    int res = 0;
    for(int i=0;i<oceannum;i++){//遍历海洋连通块
        int cur = mp[i];
        for(int cnt:connect[i])
            cur+=mp[cnt];
        res = max(res,cur);
    }
    cout<<res<<endl;
    return 0;
}

posted @   失控D大白兔  阅读(38)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示