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

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

A-牛牛爱奇数 

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

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朵花摆放成圆形,丑陋度是相邻高度差最大值,求丑陋度最小值 

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个星球,求两个集合间的最短距离。 

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;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43911947/article/details/107590446