日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通 1983:【19CSPJ普及组】公交换乘

發布時間:2025/3/17 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通 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普及组】公交换乘的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。