1029. Two City Scheduling

2023-12-21 16:19
文章标签 two city 1029 scheduling

本文主要是介绍1029. Two City Scheduling,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1029. 两地调度

公司计划面试 2N 人。第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]

返回将每个人都飞到某座城市的最低费用,要求每个城市都有 N 人抵达

 

示例:

输入:[[10,20],[30,200],[400,50],[30,20]]
输出:110
解释:
第一个人去 A 市,费用为 10。
第二个人去 A 市,费用为 30。
第三个人去 B 市,费用为 50。
第四个人去 B 市,费用为 20。最低总费用为 10 + 30 + 50 + 20 = 110,每个城市都有一半的人在面试。

 

提示:

  1. 1 <= costs.length <= 100
  2. costs.length 为偶数
  3. 1 <= costs[i][0], costs[i][1] <= 1000

解法一

//时间复杂度O(n), 空间复杂度O(n)
class Solution {
public:int twoCitySchedCost(vector<vector<int>>& costs) {priority_queue<int, vector<int>, greater<int>> negative, positive;//小顶堆int total_cost = 0, zero_count = 0;for(auto vec : costs) {total_cost += min(vec[0], vec[1]);int diff = vec[0] - vec[1];if(diff > 0) positive.push(diff);else if(diff < 0) negative.push(-diff);else zero_count++;}auto& shorter = negative.size() > positive.size() ? positive : negative;auto& longer = negative.size() > positive.size() ? negative : positive;int n = (longer.size() - shorter.size() - zero_count) / 2;while(n--) {total_cost += longer.top();longer.pop();}return total_cost;}
};

思路:

不考虑两地人数相等的情况下,先考虑最低费用total_cost,它等于costs中每一对元素 { vec[0], vec[1] }较小者之和。

对于元素对 { vec[0], vec[1] },两地费用差diff = vec[0] - vec[1]。如果diff > 0,暂且称为正对,此时去B地划算;如果diff < 0,暂且称为负对,选A地划算。如果diff = 0,暂且称为零对,去两地费用一样。

解法一使用了两个堆:positive记录正对的费用差,negative记录了负对的费用差(的绝对值)。使用一个计数zero_count记录零对的个数。

最低费用的条件:两个堆的元素数量之差(设差为正)小于zero_count。(因为零对可以充当正对,也可当负对)。

如果不满足最低费用条件,需要对元素数量大的堆的最小元素(小顶堆的堆顶)进行翻转(如正对{10, 20}本来应选A地,费用为10;翻转后选B地,相比最低费用的额外的费用为abs(diff) = 10,也就是20)。每翻转一次,两个堆的元素数量分别会加1、减1,并且要将额外费用加到最低费用total_cost上。反复翻转堆顶元素,直到满足最低费用条件,返回total_cost。

代码如上。

2019/09/08 00:54

这篇关于1029. Two City Scheduling的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/520661

相关文章

Java多线程编程模式实战指南:Two-phase Termination模式

文章来源: http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-termination?utm_source=infoq&utm_campaign=user_page&utm_medium=link 文章代码地址: https://github.com/Visce

[LeetCode] 583. Delete Operation for Two Strings

题:https://leetcode.com/problems/delete-operation-for-two-strings/description/ 题目 Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in

CodeForces 425C Sereja and Two Sequences

题意: 两组数字a和b  如果a[i]等于b[j]  则可将a[i]和b[j]前所有数字删掉  这种操作花费e体力  得到1元钱  或者一次删掉所有数字  这种操作花费等于曾经删除的所有数字个数  做完后得到所有钱  问 一共s体力 可以得到多少钱 思路: dp+二分 由数据可知最多拿到300元钱  因此可以定义  dp[i][j]表示有i元钱时  b串删除到了j处时  a串删到的位

poj 1849 Two(树形dp求直径)

树的直径:一棵树中两个点间的最长距离。 Description The city consists of intersections and streets that connect them.  Heavy snow covered the city so the mayor Milan gave to the winter-service a list of streets that ha

Longest Substring with At Most Two Distinct Characters

Given a string, find the length of the longest substring T that contains at most 2 distinct characters. For example,Given s = “eceba”, T is "ece" which its length is 3. 思路:同向双指针,跟Longest Substrin

Two to One——C语言提高题【7 kyu】

一、原题 链接:Training on Two to One | Codewars Take 2 strings s1 and s2 including only letters from a to z. Return a new sorted string (alphabetical ascending), the longest possible, containing distinct

LeetCode --- Median of Two Sorted Arrays

第一次在csdn上写备忘录,以前一直是在笔记本上写,主要是笔记本上可以随意写,只要自己能看懂,在网页上多少都受些限制,另外一方面也是想锻炼下写作能力,为以后的论文做基础吧!最近偶尔上leetcode练些题目,所以也就以这个为主题写一篇试试看,因为能力不足,理解或言辞上会有错误,还望访者不吝赐教,我定当万分感激。 好了,废话也说完了,现在进入正题: 题目: There are two sor

九度考研真题 浙大 2008-2浙大 题目1029:魔咒词典 字符串比较

//题目1029:魔咒词典 #include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main(){ char s1[1200][40],s2[1200][100]; char s[1200][100]; int num; while(gets(s)&

2pc_two phase commit详情

文章目录 1. two phase commit protocol1.假设前提2. 算法概述3. 缺点4. 详情1. coordinator 端来看2. cohorts端 5. 正确性分析6. 简单总结 看2pc和3pc看的晕晕乎乎的,看了很多博客,感觉说的都不够细致,看起来也容易犯晕,找到了两篇英文文档(不算原文),看起来好像是清楚一些,有些时候这些协议类的东西研读,如果不是

475B Strongly Connected City

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Imagine a city with n horizontal streets cro