信息学奥赛一本通 1983:【19CSPJ普及组】公交换乘
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1983:【19CSPJ普及组】公交换乘
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
ybt 1983:【19CSPJ普及組】公交換乘
【題目考點】
1. 模擬
【解題思路】
-
設置數組tk保存優惠票,優惠票的屬性有:獲得時間,價格。
設下標st,tk[st]是當前時間下,時間最早的有效的票。當i<st時tk[i]是過期的票。當i>=st時,tk[i]是有效的票。 -
循環輸入數據
- 如果是乘坐地鐵,那么添加一張優惠票
- 如果是乘坐公交
- 先更新st的值
- 從st位置開始遍歷數組tk,尋找第一個價格高于當前公交票價的優惠票,使用該優惠票。
-
算法復雜度分析
因為每次獲得優惠票的時間是有序的,因而設置變量st,每次從st開始遍歷。相比于每次從頭遍歷,這樣做可以減少對無效票的遍歷,降低時間復雜度。
tk[st]的獲得時間到當前時間最多45分鐘,題中指出“不會有兩次乘車記錄出現在同一分鐘”,因而有效的優惠票不會超過45個,每次遍歷有效優惠票的循環次數不會超過45次。
整個程序的復雜度為O(45*n) = O(n)
【題解代碼】
解法1:
#include <bits/stdc++.h> using namespace std; #define N 100005 typedef struct Ticket {int time;//time:獲得票的時間 int price;//price:買地鐵票時的價格,即價格小于等于price的公交車可以用這張票 bool isUsed;//標記這張票是否使用過 Ticket(){}Ticket(int a, int b):time(a),price(b),isUsed(false){} }Ticket; Ticket tk[N];//保存生成的票 int tk_i, st;//tk_i:記錄tk數組中待存儲的位置 st: i >= st時,tk[i]是有效的票,i < st時,tk[i]是過期的票 int main() {int n, cost = 0, type, price, time;// cost:總花費 cin>>n;for(int i = 0; i < n; ++i){cin>>type>>price>>time;if(type == 0)//地鐵{tk[tk_i++] = Ticket(time, price);//添加優惠票 cost += price;}else//公交 {while(st < tk_i && time - tk[st].time > 45)//更新過期票和有效票的分界點,使tk[st]是最早的有效的票 st++;bool usedTk = false;//是否使用了優惠票 for(int j = st; j < tk_i; ++j)//搜索優惠票,看能用哪張。循環次數不會超過45次。 {if(tk[j].price >= price && tk[j].isUsed == false)//如果這張票標價比公交票價高,且沒用過,那么可以用。 {usedTk = true;tk[j].isUsed = true;break;}}if(usedTk == false)cost += price;}}cout<<cost;return 0; }總結
以上是生活随笔為你收集整理的信息学奥赛一本通 1983:【19CSPJ普及组】公交换乘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1086:角谷猜想)
- 下一篇: 信息学奥赛一本通(1149:最长单词2)