1. 程式人生 > >公司真題系列之滴滴_餐館問題(貪心)

公司真題系列之滴滴_餐館問題(貪心)

1、題目描述

某餐館有n張桌子,每張桌子有一個引數:a 可容納的最大人數; 有m批客人,每批客人有兩個引數:b人數,c預計消費金額。 在不允許拼桌的情況下,請實現一個演算法選擇其中一部分客人,使得總預計消費金額最大
輸入描述:
輸入包括m+2行。 第一行兩個整數n(1 <= n <= 50000),m(1 <= m <= 50000) 第二行為n個引數a,即每個桌子可容納的最大人數,以空格分隔,範圍均在32位int範圍內。 接下來m行,每行兩個引數b,c。分別表示第i批客人的人數和預計消費金額,以空格分隔,範圍均在32位int範圍內。
輸出描述:

輸出一個整數,表示最大的總預計消費金額

2、示例

輸入
3 5
2 4 2
1 3
3 5
3 7
5 9
1 10
輸出

20

3、問題解析

1)我一開始的思路是對桌子課容納的人數a[]排序,對客人pair<b,c>排序,對每個桌子選擇人數滿足要求的最大消費金額,另外有一個額外的陣列flag[i]記錄第i批客人有沒有被選擇。這個的時間複雜度是O(n*m),對於題目中給定的規模肯定是超時的,在測試過程中通過率只有90%

第一次的程式碼如下:

#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<cstdio>
#include<time.h>
using namespace std;
typedef long long ll;
int main() {
	int n, m;
	cin >> n >> m;
	vector<int> a(n);
	vector<pair<int, int>> cus(m);
	vector<int>flag(m,0);//flag[i]==0代表可以選擇,flag==1代表已經被選擇
	int i,j,pos=-1;
	ll max = 0, sum = 0;//max記錄對於每個桌子可以有的最大消費金額,sum代表總的消費金額
	for (i = 0; i < n; ++i) {
		cin >> a[i];
	}
	for (i = 0; i < m; ++i) {
		cin >> cus[i].first >> cus[i].second;
	}
	time_t start_time = clock();
	sort(a.begin(), a.end());
	sort(cus.begin(), cus.end());

	for (i = 0; i < n; ++i) {
		max = 0;
		pos = -1;
		for (j = 0; j<m&&cus[j].first <= a[i]; ++j) {//要注意j<m
			if (flag[j] == 1) {
				continue;
			}
			if (j + 1 < m&&cus[j].first == cus[j + 1].first&&flag[j + 1] == 0) {//直接跳轉到相同人數消費金額最大的地方
				continue;
			}
			else {
				if (cus[j].second > max) {
					max = cus[j].second;
					if (pos != -1)
						flag[pos] = 0;//每次選擇新的客人之後,要把之前的客人置為0
					flag[j] = 1;
					pos = j;
				}
			}//end else
		}//end for j
		//cout << "i=" << i << " pos="<<pos<<" max=" << max << endl;
		sum += max;
	}
	cout << std::fixed;
	cout << sum << endl;
	time_t end_time = clock();
	cout << "執行時間:" << (double)(end_time - start_time) / CLOCKS_PER_SEC << "s" << endl;
}

2)上面的思路是為每個桌子找到合適的客人,參考了別人的思路,對客人以消費金額降序排列,桌子也按照容量降序排列,然後為每批客人找到合適的桌子(也就是找到滿足要求的容量最小的桌子),很關鍵的一步:在找到桌子之後,將其從桌子的佇列中刪除,這樣就不斷減小了問題的規模。也有的思路是在找桌子的時候採用二分法(??)

下面是修改之後的程式碼:

需要注意的幾個程式設計的細節:

呼叫erase方法的時候要保證a.begin()+j-1大於0,也就是j要大於0,下面這一行程式碼可以保證這個條件

		if (cus[i].second > a[0])//容量最大的桌子也不滿足要求
			continue;
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<cstdio>
#include<time.h>
using namespace std;
typedef long long ll;
int main() {
	int n, m;
	cin >> n >> m;
	vector<int> a(n);
	vector<pair<int, int>> cus(m);//消費金額,人數
	int i, j;
	ll max = 0, sum = 0;//max記錄對於每個桌子可以有的最大消費金額,sum代表總的消費金額
	for (i = 0; i < n; ++i) {
		cin >> a[i];
	}
	for (i = 0; i < m; ++i) {
		cin >> cus[i].second >> cus[i].first;
	}
	time_t start_time = clock();
	sort(a.begin(), a.end());
	reverse(a.begin(), a.end());//桌子容量從大到小
	sort(cus.begin(), cus.end());
	reverse(cus.begin(), cus.end());//消費金額從大到小
	//對於每個金額的消費者,選擇滿足其要求的最小容量的桌子
	for (i = 0; i < m; ++i) {
		if (n == 0)//沒有可以用的桌子了
			break;
		if (cus[i].second > a[0])//容量最大的桌子也不滿足要求
			continue;
		int j = 0;
		while (j < n&&a[j] >= cus[i].second)
			j++;//j-1是滿足其要求的最小容量的桌子
		sum += cus[i].first;
		a.erase(a.begin() + j - 1);//刪除已經用掉的桌子,要注意j必須大於0
		n--;//桌子的規模減1
	}
	
	cout << std::fixed;
	cout << sum << endl;
	time_t end_time = clock();
	cout << "執行時間:" << (double)(end_time - start_time) / CLOCKS_PER_SEC << "s" << endl;
}

相關推薦

公司系列滴滴_餐館問題貪心

1、題目描述某餐館有n張桌子,每張桌子有一個引數:a 可容納的最大人數; 有m批客人,每批客人有兩個引數:b人數,c預計消費金額。 在不允許拼桌的情況下,請實現一個演算法選擇其中一部分客人,使得總預計消費金額最大輸入描述:輸入包括m+2行。 第一行兩個整數n(1 <=

java設計模式系列設計模式概要1

而不是 行為型模式 一句話 創建 rom 多次 ati 代理模式 之間 一、什麽是設計模式   設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

Appium python自動化測試系列appium環境搭建

ftp 自動化 手動 文件 搭建環境 做到 安裝python reg 成員 ?2.1 基礎環境搭建 當我們學習新的一項技術開始基本都是從環境搭建開始,本書除了第一章節也是的,如果你連最基礎的環境都沒有那麽我們也沒必要去說太多,大概介紹一下: 1、因為appium是支持and

談談-Android-PickerView系列源碼解析

需求 動態 () comm tag 多個 來源 ntc 寬高 前言   WheelView想必大家或多或少都有一定了解, 它是一款3D滾輪控件,效果類似IOS 上面的UIpickerview 。按照國際慣例,先放一張效果圖:   以上是Android-PickerView

Openstack 安裝部署指南翻譯系列 Horizon服務安裝Dashboad

openstack 翻譯 horizon安裝1.1.1.1. Horizon服務安裝(Dashboad)本節介紹如何在控制器節點上安裝和配置儀表板。儀表板所需的唯一核心服務是身份服務。您可以使用儀表板與其他服務(如鏡像服務,計算和網絡)結合使用。您還可以在具有獨立服務(如對象存儲)的環境中使用儀表板。註意:本

Openstack 安裝部署指南翻譯系列 Keystone服務安裝Identity

openstack 翻譯 keystone安裝OpenStack系統由分開安裝的幾個關鍵服務組成。這些服務可根據其他雲需求一起工作,包括計算(Compute),身份(Identity),網絡(Networking),鏡像(Image),塊存儲(Block Storage),對象存儲(Object Storag

C#系列聖誕樹代碼

== log 技術分享 tel key 分享圖片 img int src 馬上就到聖誕節啦,這裏我寫啦一個最簡單的聖誕樹代碼 Console.WriteLine("請輸入您需要的聖誕樹的大小<數字>"); int n = int.Parse

Centos7 minimal 系列Redis共享sessionid

image strings 系列 sha edi esp get blog 用戶 這一章節的內容就當看看,只是個人理解,我想應該是有誤的。 一、SessionId   sessionid是一個會話的key,瀏覽器第一次訪問服務器會在服務器端生成一個session,有一個se

從零開始系列vue全家桶3安裝使用vuex

info 獲取 clas from 顯示 共享 安裝 default 重要 什麽是vuex? vuex:Vue提供的狀態管理工具,用於同一管理我們項目中各種數據的交互和重用,存儲我們需要用到數據對象。 即data中屬性同時有一個或幾個組件同時使用,就是data中共用的屬性。

從零開始系列vue全家桶4帶新手小白一起搭建第一個個人網站項目

轉載 個人網站 rfi red nbsp oot ott osx 全部 未經允許,嚴禁轉載,全文由blackchaos提供。 在安裝好了前面大部分需要的插件,我們開始進行第一個個人項目。結合vue+vuex+vue-cli+vue-router+webpack使用。

WPF編遊戲系列 七 動畫效果2

sed 其中 所有 wpf olt targe 針對 font bar 原文:WPF編遊戲系列 之七 動畫效果(2)       上一篇已經對關閉窗口圖標進行了動畫效果處理,本篇將對窗口界面的顯示和關閉效果進行處理

Docker系列CentOS7安裝Docker

add 程序 發布 更新 介紹 entos star alt ice 0、前言 整體架構目錄:ASP.NET Core分布式項目實戰-目錄 一、瞎扯淡(只講有用的) 感興趣的同學可以上網搜索一下docker具體的介紹。我這邊主要介紹偏實戰的內容,不喜勿噴,有問題也請

【Android 進階】仿抖音系列列表播放視訊

在上一篇【Android 進階】仿抖音系列之列表播放視訊(二)中,我們實現列表播放視訊,這一篇我們來對其做些優化。 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊(二) 【Android 進階】仿抖音

【Android 進階】仿抖音系列列表播放視訊

上一篇中,我們實現了仿抖音上下翻頁切換視訊的效果,詳見【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一),這一篇,我們來實現抖音列表播放視訊。 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊(二)

sip phone系列Java sip phonepeers原始碼淺析

    從整理幾款sip phone,到簡單修改播放聲音檔案,發現少了最基本的環境搭建及原始碼的認識,現在重新記錄下。     1.sip簡要介紹     這裡提及一些sip相關的必要知識,方便對該協議有個整體的瞭解,同時也可以為後續相關的應用開發提供準備。更詳細的內容可以

大資料系列實時計算Spark十三機器學習

1.機器學習簡介 機器學習可能是當下最火的話題了。之前我們所做的一些工作,比如說java開發,安卓等等,其實無非就是在來回的寫方法,呼叫方法,而機器學習說的通俗一點可能就是找函式。要知道,我們現在面對的是巨大的資料量,對於這麼多的資料量,我們不太可能找到一個描述資料的方法或

PAT乙級全集-PAT (Basic Level) Practise 中文

1001. 害死人不償命的(3n+1)猜想 (15) 卡拉茲(Callatz)猜想: 對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到n=1。卡拉茲在1950年的世界數學家大會上公佈了這

大資料系列Hadoop知識整理MapReduce的核心Shuffle詳解

1.MapReduce的核心之shuffle詳解 上一篇中我們介紹了MapReduce是什麼,以及MapReduce的執行過程,其中在執行過程中主要分為Map端與Reducer端,MapReduce計算模型主要完成了對映與化簡,在這其中,有一個最重要的過程那就是其核心——s

Vue.js系列vue-router(中)4

說明: 我們專案現在用的是:vue2.0 + vue-cli + webpack + vue-router2.0 + vue-resource1.0.3 如果大家在實踐的過程中與本文所說的內容有較大區別的話看看是不是版本問題。 本文是一系列文章,在我對V

Vue.js系列專案結構說明2

說明: 我們專案現在用的是:vue2.0 + vue-cli + webpack + vue-router2.0 + vue-resource1.0.3 如果大家在實踐的過程中與本文所說的內容有較大區別的話看看是不是版本問題。 本文是一系列文章,在我對V