貪心演算法之經典題目 訂票

2021-09-06 20:24:27 字數 1441 閱讀 8228

題目:一票務辦公室為**會售票,**某一固定數量的連號票(簡稱套票)。購票訂單以該套票中最小的座位號作為標誌。由於不能滿足所有訂單,故而採用:若訂單完全滿足觀眾要求的票全價;若訂單中至少乙個座位與觀眾要求不同,則半價。現求怎樣處理訂單,才能使總收入最高。輸入為套票裡座位數量,訂單數以及每個訂單對應的座位號(最小的座位號為標誌)。輸出訂單處理結果,即處理後的套票號碼。(不要求順序,且輸入資料都符合要求,最小座位號為1,訂單可以不被接受。)

解題思路:

採用貪心演算法,3個步驟:

1)  試圖分配盡可能多的全價套票。

逆序處理。按照座位號遞減的次序來處理訂單,只要可行就立馬接受該訂單。記為s1。

2)  調整s1以減少浪費。

正序處理。若要用訂單p來代替p1,就要求p3)  用半價票填充空位。

剩餘未被接受的訂單全取半價票,填充s2中全價套票之間的空位。記為s3。

**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9

10using

namespace

std;

1112

#define ll long long

1314

const

int maxl=100;//

座位數上限

15const

int nl=50;//

訂單數上限

16int len,n;//

套票座位長度,訂單數

17int

nn[nl],tnn[nl];

18bool bn[nl]={};

1920

intmain()

2137 tn=1;38

for(int i=0;i//

the second choose

3945

if(nn[i]continue;46

for(int j=i+1;j)

4755

else

5663

break;64

}65}66

}67 tc=n-tc;

68 tn=1;69

for(int i=0;i//

the last choose

7078 tn=nn[i]+len;79}

80while(tc21)81

86for(int i=0;i//

output

8791

for(int i=0;i)

92 printf("

%d "

,tnn[i]);

93 printf("\n"

);94

return0;

95 }

view code

貪心演算法之經典題目 訂票

題目 一票務辦公室為 會售票,某一固定數量的連號票 簡稱套票 購票訂單以該套票中最小的座位號作為標誌。由於不能滿足所有訂單,故而採用 若訂單完全滿足觀眾要求的票全價 若訂單中至少乙個座位與觀眾要求不同,則半價。現求怎樣處理訂單,才能使總收入最高。輸入為套票裡座位數量,訂單數以及每個訂單對應的座位號 ...

經典貪心演算法 貪心演算法概述

貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...

貪心 02 貪心演算法題目解析

122.買賣 的最佳時機 ii 134.加油站 給定乙個陣列,它的第 i 個元素是一支給定 第 i 天的 設計乙個演算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易 多次買賣一支 注意 你不能同時參與多筆交易 你必須在再次購買前 掉之前的 示例 1 輸入 7,1,5,3,6,4 輸出 7...