旅行Ⅰ题解

旅行Ⅰ

https://www.nowcoder.com/questionTerminal/ecc6e261da68412caad810669b1e891f

做法1:AC
按照题意模拟即可,因为要每次选择可达中花费最小的且编号最小的,所以我们用一个优先队列维护拓扑就好,从优先队列中取出花费&编号最小的,然后把这座城市所影响的城市的度数--,我们会发现变为0的只可能是这次度数--的城市,那么只需要将在这次操作中城市度数变为0的城市加入优先队列,然后重复上述操作直到钱不够或者走完了所有城市。时间复杂度为,空间复杂度为

/**
 * struct Point {
 *    int x;
 *    int y;
 * };
 */
typedef long long ll;
class Solution {
public:
    /**
     * 
     * @param N int整型 N
     * @param V int整型 V
     * @param A int整型一维数组 A
     * @param ALen int A数组长度
     * @param List Point类vector List
     * @return int整型
     */
    struct node {
        ll val,id;
        bool friend operator <(node a,node b) {
            if(a.val==b.val) return a.id>b.id;
            return a.val>b.val;
        }
    }p;
    priority_queue<node>q;
    int Travel(int N, int V, int* A, int ALen, vector<Point>& List) {
        // write code here
        int du[N+1];
        vector<int>v[N+1];
        memset(du,0,sizeof du);
        for(auto i:List) {
            v[i.x].push_back(i.y);
            du[i.y]++;
        }
        for(int i=1;i<=N;i++) if(du[i]==0) q.push({A[i-1],i});
        int ans=0;
        while(!q.empty()) {
            p=q.top();
            q.pop();
            if(p.val>V) break;
            V-=p.val;
            ans++;
            for(auto i:v[p.id]) {
                du[i]--;
                if(du[i]==0)  q.push({A[i-1],i});
            }
        }
        return ans;
    }
};

做法2:TLE
按照题意模拟即可,因为要每次选择可达中花费最小的且编号最小的,所以我们用一个优先队列维护拓扑就好,从优先队列中取出花费&编号最小的,然后把这座城市影响的城市的度数--,然后的去寻找城市度数为0则加入优先队列,然后重复上述操作知道钱不够或者走完了所有城市。时间复杂度为,空间复杂度为

/**
 * struct Point {
 *    int x;
 *    int y;
 * };
 */
typedef long long ll;
class Solution {
public:
    /**
     * 
     * @param N int整型 N
     * @param V int整型 V
     * @param A int整型一维数组 A
     * @param ALen int A数组长度
     * @param List Point类vector List
     * @return int整型
     */
    struct node {
        ll val,id;
        bool friend operator <(node a,node b) {
            if(a.val==b.val) return a.id>b.id;
            return a.val>b.val;
        }
    }p;
    priority_queue<node>q;
    int vis[100010];
    int Travel(int N, int V, int* A, int ALen, vector<Point>& List) {
        // write code here
        int du[N+1];
        vector<int>v[N+1];
        memset(du,0,sizeof du);
        for(auto i:List) {
            v[i.x].push_back(i.y);
            du[i.y]++;
        }
        for(int i=1;i<=N;i++) if(du[i]==0) q.push({A[i-1],i}),vis[i]=1;
        int ans=0;
        while(!q.empty()) {
            p=q.top();
            q.pop();
            if(p.val>V) break;
            V-=p.val;
            ans++;
            for(auto i:v[p.id]) 
                du[i]--;
            for(int i=1;i<=N;i++) if(du[i]==0&&!vis[i])  q.push({A[i-1],i}),vis[i]=1;
        }
        return ans;
    }
};
全部评论

相关推荐

瑞雪兆丰年_:可以贴个超级大的校徽,以防HR眼拙
点赞 评论 收藏
分享
头像
昨天 20:19
已编辑
门头沟学院 人工智能
本文略长,献给身处双非、学院本科的低年级依旧陷入迷茫的同学,一个参考。夹杂强烈主观因素,若观点不同,仅当笑料。近日,工作之余的午休时间给母校的学弟学妹进行了宣讲,同时也接受了牛客的访谈,不约而同的触发了两个关键词考研,就业。现象今年和去年,认识的学弟学妹,来自知某、抖某、牛客等系列的学弟学妹,这次宣讲,约有20个学弟学妹来加了我的联系方式,向我取经,聊聊未来,聊聊想法。我这里简单概括一下。1.现在很迷茫,大方向摇摆就业还是考研,但是倾向考研。小方向摇摆竞赛和项目,不知道怎么去做,不知道怎么开始。2.考研的直接目的绝大多数都是为了(混)学历,根本目的就是提高就业竞争力。3.我把他们都拉了个群,在...
牛客85294058...:“私聊能够滔滔不绝,而拉了一个小群之后就完全一声不吭”个人观点这跟从小到大“不要浪费大家时间”的社会环境有关:个人化的提问,如果你上学时有留心、或者参加QA环节多,会注意到这种做法经常是被人骂的。要营造让大家开口的氛围和做出欢迎讨论的议题设置还是比较难的,期待方法探索。
投递大连飞创信息技术有限公司等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务