歡迎來訪
題目鏈結
拿到題目之後,首先想想暴力的做法,暴力的做法按照時間列舉,在某個時間點上列舉所有的外賣店若是有訂單優先順序就加上cnt(訂單的數量) * 2
,否則就減去1
,再按照優先順序的數值判斷是否在優先快取中。列舉完所有時間以後,再看t
時刻的優先快取中的外賣店的數量。這種暴力的時間複雜度我寫的**是o(n
∗t+m
∗t
)o(n * t + m * t)
o(n∗t+
m∗t)
,顯然是會超時的。
然後再想怎麼優化,再按照時間列舉的過程中,其實對於某個店鋪來說在很多時間上是沒有訂單的,比如說t1到t2時刻中i店鋪沒有訂單,則t2時刻的優先順序應該為:max(0, score[i] - (t2 - t1 - 1)) + 2
,這樣就避免了列舉中間沒有訂單的時間點。
暴力列舉 o(n
∗t+m
∗t
)o(n * t + m * t)
o(n∗t+
m∗t)
在acwing上過了9個點,考場上想不到最優解就寫暴力吧,畢竟還是有部分分的。
#include
#include
#include
#include
using
namespace std;
#define x first
#define y second
typedef pair<
int,
int> pii;
const
int n =
100010
;int n, m, t;
pii orders[n]
;int score[n]
;bool st[n]
;bool f[n]
;int
main()
}for
(int j =
1; j <= n; j++)if
(!f[j]
)memset
(f,false
,sizeof
(f));}
int res =0;
for(
int i =
1; i <= n; i++)if
(st[i]
) res++
;printf
("%d"
, res)
;return0;
}
優化 o(m
)o(m)
o(m)
#include
#include
#include
#include
using
namespace std;
#define x first
#define y second
typedef pair<
int,
int> pii;
const
int n =
100010
;int n, m, t;
int score[n]
, last[n]
;bool st[n]
;pii orders[n]
;int
main()
for(
int i =
1; i <= n; i++)}
int res =0;
for(
int i =
1; i <= n; i++)if
(st[i]
) res++
;printf
("%d"
, res)
;return0;
}
acwing 1241 外賣店優先順序
飽了麼 外賣系統中維護著 n 家外賣店,編號 1 n 每家外賣店都有乙個優先順序,初始時 0 時刻 優先順序都為 0 每經過 1 個時間單位,如果外賣店沒有訂單,則優先順序會減少 1 最低減到 0 而如果外賣店有訂單,則優先順序不減反加,每有一單優先順序加 2 如果某家外賣店某時刻優先順序大於 5 ...
送外賣優先順序 AcWing1241 外賣店優先順序
外賣店優先順序 一定對的做法,模擬每個時刻的情況 判斷哪些店有訂單哪些店沒有訂單 10 5次方 離散的有很多個訂單,把中間壓縮掉,連續沒有訂單的,放到購買訂單那裡處理 將所有訂單按照時間順序排序,一次處理一批訂單相同的訂單,相同時刻 模擬題偽 比較重要 include include include...
第十屆藍橋杯A組(C C 組) 外賣店優先順序
這道題還是列舉的思路,另外還運用到了vector容器。就是按時間乙個乙個出訂單,沒出乙個判斷一次,判斷此刻店的狀態。把問題劃分為一家一家店的小問題。include include includeusing namespace std const int maxm 100000 vectora max...