牛客编程巅峰赛S1第6场 - 黄金&钻石&王者

牛牛爱奇数

https://ac.nowcoder.com/acm/contest/6629/A

A 牛牛爱奇数

题意:给定一组数,每次可以选择一个偶数,使得所有与相等的数都除以2,问把所有数都变成一个奇数所需要的最小的操作数
题解:按题意模拟即可,把所有数存放到map中,然后反向迭代(比赛中忘了反向迭代怎么用了,浪费半天时间qwq)

class Solution {
public:
    /**
     * 返回一个数,代表让这些数都变成奇数的最少的操作次数
     * @param n int整型 代表一共有多少数
     * @param a int整型vector 代表n个数字的值
     * @return int整型
     */
    int solve(int n, vector<int>& a) {
        // write code here
        map<int,int>um;
        int cnt=0;
        for(int i=0; i<n; i++){
           if(a[i]%2==0){
               um[a[i]]++;
               cnt++;
           }
        }
        int ans=0;
        map<int,int>::reverse_iterator i; 
        for(i = um.rbegin(); i!= um.rend(); ++i){ 
            if(i->second!=0){
                ans++;
                if(i->first/2%2==0){
                    um[i->first/2]+=i->second;
                }
                else{
                    cnt-=i->second;
                }
            }
        }
        return ans;
    }
};

B 牛牛摆放花

题意:给定一串数字,问你怎么摆放成一个首尾相连的圆,使得相邻的两数之差最大值最小
题解:很明显可以知道,要想相邻的数之差最小,就要使得两数尽可能的靠近,排序往双端队列两边加数即可

class Solution {
public:
    /**
     * 返回按照这些花排成一个圆的序列中最小的“丑陋度”
     * @param n int整型 花的数量
     * @param array int整型vector 花的高度数组
     * @return int整型
     */
    int solve(int n, vector<int>& array) {
        // write code here
        deque<int>d;
        sort(array.begin(), array.end());
        int st=1;
        int ans=0;
        for(int i=array.size()-1; i>=0; i--){
            if(st==1){
                if(d.size() > 0){
                    ans=max(ans,d.front()-array[i]);
                }
                d.push_front(array[i]);
            }else{
                ans=max(ans,d.back()-array[i]);
                d.push_back(array[i]);
            }
            st^=1;
        }
        return ans;
    }
};

C 星球游戏

题意:两个人占领n个点的p和q个点,然后问你两个集合的最短路径长度
题解:由于题目限制并且,那么说明不会太大,直接对于跑单源最短路(堆优化),然后找出答案答案

const int maxn = 2e5+10;
const int INF = 0x3f3f3f3f;
struct node{
    int val,id;
    node(int id,int val):id(id),val(val) {}
    bool operator <(const node &hs)const{
        return val>hs.val;
    }
};
struct edge{
    int next,to,w;
}e[maxn*2];
int head[maxn],cnt;

void addedge(int u,int v,int w){
    e[++cnt]=edge{head[u],v,w};
    head[u]=cnt;
}
int dis[maxn],vis[maxn];
void dijkstra(int from,int n){
    for(int i=1;i<=n;i++){
        dis[i]=INF;
        vis[i]=0;
    }
    priority_queue<node>q;
    q.push(node(from,0));
    dis[from]=0;
    while(!q.empty()){
        int cur=q.top().id;
        q.pop();
        if(vis[cur])continue;
        vis[cur]=true;
        for(int i=head[cur]; i ; i=e[i].next){
            int v=e[i].to;
            if(dis[cur]+e[i].w < dis[v]){
                dis[v]=dis[cur]+e[i].w;
                q.push(node(v,dis[v]));
            }
        }
    }
}
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 Length(vector<int>& niuniu, vector<int>& niumei, vector<vector<int> >& path, int nn) {
        // write code here
        int p=niuniu.size();
        int q=niumei.size();
        vector<int>a;
        vector<int>b;
        if(p>q){
            for(auto i:niumei) a.emplace_back(i);
            for(auto i:niuniu) b.emplace_back(i);
            swap(p,q);
        }else{
            for(auto i:niuniu) a.emplace_back(i);
            for(auto i:niumei) b.emplace_back(i);
        }
        for(auto i:path){
            int x=i[0];
            int y=i[1];
            int z=i[2];
            addedge(x,y,z);
            addedge(y,x,z);
        }
        int ans=INF;
        for(auto i:a){
            dijkstra(i,nn);
            for(auto j:b){
                ans=min(ans,dis[j]);
            }
        }
        if(ans == INF) ans=-1;
        return ans;
    }
};
全部评论
C题可以直接加一个源点0,源点和P中的每一个点连一条权值为0的边,这样就只需要跑一次单源最短路了。
点赞 回复 分享
发布于 2020-07-26 18:58

相关推荐

10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
4 收藏 评论
分享
牛客网
牛客企业服务