[CSP-J 2019]ゲルマニウム簡潔に説明横切るバス転送によって第2の質問

話題の簡潔な分析

水問題グループの人気が、困難なく、唯一の適切うまくチケットを取り扱っております。

メモリ券

情報を記述するために$チケット$クラスのチケットを書いてみましょう:

class Ticket {                              //Ticket类用于存储优惠票信息
public:
    int time, price;
    Ticket():time(0),price(0){}
    Ticket(int t,int p):time(t),price(p){}
};

次いで、得られた時系列順に保存されている$リスト$コンテナ付きチケット($ベクトル$、$両端キュー$コースは、あなたが、しかし、この質問に$一覧$高い効率を使用して、中央の削除操作の多くを必要とするかもしれないことができます)。$とバス、チェックし、削除期限切れのチケットは$機能を確認するたびに、チケットを使用できるかどうかと、それから$無料$関数が決定します。コードは以下の通りであります:


list<Ticket>tic;                            //相比于vector和deque,list容器在中间的插入和删除上效率更高
bool free(int p) {                          //检查是否存在可用的优惠票
    if (tic.empty())return false;
    for(list<Ticket>::iterator iter = tic.begin(); iter != tic.end(); iter++) {
        if (iter->price >= p) {     //可以消耗此优惠票
            tic.erase(iter);    //删除此优惠票
            return true;        //找到符合条件的优惠票,返回true
        }
    }
    return false;                       //上一步中未找到符合条件的优惠票,返回false
}
void check(int t) {                         //检查是否存在已过期的优惠票
    if (tic.empty())return;
    list<Ticket>::iterator iter = tic.begin();
    while (iter->time < t && iter != tic.end()) {
        tic.erase(iter++);
    }
}

シミュレーション

各バスがチェックされ、消費券(お金に使用することはできません)された後、直接、総コストが増加し、$で$リストにチケットを追加する地下鉄に乗ります。コードは以下の通りであります:

int p;
if (read()) {                               //读取到1,为公交车
    p = read();                         //读取票价
    check(read());                      //第三个读取的数据为乘车时间,检查有无过期优惠票
    if (!free(p)) {                     //如果无法使用优惠票
        ans += p;                   //增加费用
    }
}
else {                                      //不为公交车即为地铁
    p = read();                         //读取票价
    ans += p;                           //增加费用
    tic.push_back(Ticket(read() + 45, p));//获得优惠票,加入list中
}

完全なコード

#include <iostream>
#include<cstdio>
#include<list>

using namespace std;

inline int read() {                                             //快读
    int x = 0; char ch = getchar();
    while (ch > '9' || ch < '0')ch = getchar();
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + (ch - 48);
        ch = getchar();
    }
    return x;
}

class Ticket {                                                  //Ticket类用于存储优惠票信息
public:
    int time, price;
    Ticket():time(0),price(0){}
    Ticket(int t,int p):time(t),price(p){}
};

list<Ticket>tic;                        //相比于vector和deque,list容器在中间的插入和删除上效率更高
bool free(int p) {                                      //检查是否存在可用的优惠票
    if (tic.empty())return false;
    for(list<Ticket>::iterator iter = tic.begin(); iter != tic.end(); iter++) {
        if (iter->price >= p) {                         //可以消耗此优惠票
            tic.erase(iter);                        //删除此优惠票
            return true;                            //找到符合条件的优惠票,返回true
        }
    }
    return false;                                           //上一步中未找到符合条件的优惠票,返回false
}
void check(int t) {                                             //检查是否存在已过期的优惠票
    if (tic.empty())return;
    list<Ticket>::iterator iter = tic.begin();
    while (iter->time < t && iter != tic.end()) {
        tic.erase(iter++);
    }
}

int n;                                                          //乘车记录数
int ans;                                                        //乘车总费用

int main()
{
    n = read();
    while (n > 0) {
        int p;
        if (read()) {                                   //读取到1,为公交车
            p = read();                             //读取票价
            check(read());                          //第三个读取的数据为乘车时间,检查有无过期优惠票
            if (!free(p)) {                         //如果无法使用优惠票
                ans += p;                       //增加费用
            }
        }
        else {                                          //不为公交车即为地铁
            p = read();                             //读取票价
            ans += p;                               //增加费用
            tic.push_back(Ticket(read() + 45, p));  //获得优惠票,加入list中
        }
        n--;
    }
    printf("%d", ans);
    return 0;
}

概要

主題自体は、チケットの取り扱いで唯一の難点は難しいことではありませんアカウントの時間を考慮して、チケットを削除したいとき運賃が良いとされる必要があります。

高効率ではなく、$ベクトル$と$両端キュー$サポートランダムアクセス$一覧$コンテナは、簡単にREを通過する際に、イテレータ、なじみのない単語を使用する必要があります。そう$、このタイトルデータの小規模与えられたベクトル$と$両端キュー$の事実があることが、すべての後に、使用済み$リスト$の罰金(集)ベネフィット(チュ)求める(ハオ)ジン(館)それはないですか?

おすすめ

転載: www.cnblogs.com/duimianlongge/p/12115463.html