欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 (解题报告)

程序员文章站 2022-04-22 20:44:21
题目链接:https://ac.nowcoder.com/acm/contest/6629A-牛牛爱奇数题意:有n个数,既有奇数又有偶数,可以选中一种偶数,将其变成原来的一半,比如选中2然后可以把序列中所有的2变成1,最少经过多少次操作,才能使得序列中都是奇数?hint:由于可以对所有选中的偶数进行操作,因此可以直接用map标记偶数是否被选中过,如果没有的话cnt++。AC代码:class Solution {public: /** * ......

题目链接:https://ac.nowcoder.com/acm/contest/6629

A-牛牛爱奇数 

题意:有n个数,既有奇数又有偶数,可以选中一种偶数,将其变成原来的一半,比如选中2然后可以把序列中所有的2变成1 ,最少经过多少次操作,才能使得序列中都是奇数?

牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 (解题报告)

牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 (解题报告)

hint:由于可以对所有选中的偶数进行操作,因此可以直接用map标记偶数是否被选中过 ,如果没有的话cnt++。

AC代码: 

class Solution {
public:
    /**
     * 返回一个数,代表让这些数都变成奇数的最少的操作次数
     * @param n int整型 代表一共有多少数
     * @param a int整型vector 代表n个数字的值
     * @return int整型
     */
    map<int,int>vis;
    vector<int>v;
    int solve(int n, vector<int>& a) {
        // write code here
        for(auto i:a){
            if(i%2==0){
                if(!vis[i]){
                    vis[i]=1;
                    v.push_back(i);
                }
            }
        }
        int cnt=0;
        if(v.size()==0)return cnt;
        for(auto i:v){
            int t=i;
            while(t%2==0){
                if(vis[t]==2)break;
                vis[t]=2;
                cnt++;
                t/=2;
            }
        }
        return cnt;
    }
};

 B-牛牛摆放花

题意:n朵花摆放成圆形,丑陋度是相邻高度差最大值,求丑陋度最小值 

牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 (解题报告)

牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 (解题报告)

hint:构造题。

先sort排序,然后依次放于首尾,求出的丑陋度最小。 

AC代码:

class Solution {
public:
    /**
     * ​返回按照这些花排成一个圆的序列中最小的“丑陋度”
     * @param n int整型 花的数量
     * @param array int整型vector 花的高度数组
     * @return int整型
     */
    int solve(int n, vector<int>& array) {
        // write code here
        sort(array.begin(),array.end());
        vector<int>a(n,0);
        int cnt=0;
        for(int i=0;i<n/2;i++){
            a[i]=array[cnt++];
            a[n-1-i]=array[cnt++];
        }
        if(n&1)a[n/2]=array[cnt];
        int mx=abs(a[0]-a[n-1]);
        for(int i=1;i<n;i++)mx=max(mx,abs(a[i]-a[i-1]));
        return mx;
    }
};

 C-星球游戏

题意:牛牛占据p个星球,牛妹占据q个星球,求两个集合间的最短距离。 

牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 (解题报告)

牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 (解题报告)

hint:bfs更新从牛牛星球开始走的最短距离dis,牛妹星球dis中最短的既是答案。 

AC代码:  

class Solution {
public:
    /**
     * 
     * @param niuniu int整型vector 牛牛占领的p个星球的编号
     * @param niumei int整型vector 牛妹占领的q个星球的编号
     * @param path int整型vector<vector<>> m条隧道,每条隧道有三个数分别是ui,vi,wi。ui,vi分别是隧道的两边星球的编号,wi是它们之间的距离
     * @param nn int整型 星球个数n
     * @return int整型
     */
    int dis[234567],vis[234567];
    const int inf = 0x3f3f3f3f;
    struct node{
        int u,cost;
    };
    vector<node>v[234567];
    int Length(vector<int>& niuniu, vector<int>& niumei, vector<vector<int> >& path, int nn) {
        // write code here
        memset(dis,inf,sizeof(dis));
        memset(vis,0,sizeof(vis));
        for(auto i:path){
            v[i[0]].push_back({i[1],i[2]});
            v[i[1]].push_back({i[0],i[2]});
        }
        queue<int>q;
        for(auto niu:niuniu){//可以将所有的niuniu都进队列,同步操作
            dis[niu]=0;
            q.push(niu);
        }
        while(q.size()){
            int t=q.front();q.pop();
            if(vis[t])continue;
            vis[t]=1;
            for(auto i:v[t]){
                if(dis[i.u]+i.cost<dis[t])dis[t]=dis[i.u]+i.cost;
                q.push(i.u);
            }
        }
        int mx=inf;
        for(auto mei:niumei){
            mx=min(mx,dis[mei]);
        }
        if(mx==inf)return -1;
        return mx;
    }
};

 

本文地址:https://blog.csdn.net/weixin_43911947/article/details/107590446

相关标签: 最短路径