美文网首页pat tricksPTA甲级
结构体排序➕分时计价 | 1016 Phone Bills (2

结构体排序➕分时计价 | 1016 Phone Bills (2

作者: zilla | 来源:发表于2019-01-27 12:51 被阅读0次

    1016 Phone Bills
    想想就排个序,配个对,算算价格,然而好久才ac啊(

    就差个等号 差2个case 6分呢 > >=
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <vector>
    
    using namespace std;
    const int LON = strlen("on-line");
    int rate[24], nn, month;
    struct Record {
        char name[22];
        int mdhm[4];
        int state;//0,1
    } records[1010];
    struct Pay {
        int r_1;
        int r;
        int time;
        int price;
    };
    vector<Pay> personal_pay;
    
    int cmp(const void *re1, const void *re2) {
        Record r1 = *(Record *) re1, r2 = *(Record *) re2;
        int res = strcmp(r1.name, r2.name);
        if (res != 0)return res;
        int a, b;
        for (int i = 1; i < 4; ++i) {
            a = r1.mdhm[i], b = r2.mdhm[i];
            if (a != b)
                return a - b;
        }
        res = r1.state - r2.state;
        if (res != 0)return res;
        return 0;
    }
    
    void print_payinfo(char name[]) {
        if (!personal_pay.empty()) {
            printf("%s %02d\n", name, month);
            int size = personal_pay.size(), total = 0;
            for (int i = 0; i < size; ++i) {
                printf("%02d:%02d:%02d %02d:%02d:%02d %d $%d.%02d\n",
                       records[personal_pay[i].r_1].mdhm[1], records[personal_pay[i].r_1].mdhm[2],
                       records[personal_pay[i].r_1].mdhm[3], records[personal_pay[i].r].mdhm[1],
                       records[personal_pay[i].r].mdhm[2], records[personal_pay[i].r].mdhm[3],
                       personal_pay[i].time, personal_pay[i].price / 100, personal_pay[i].price % 100);
                total += personal_pay[i].price;
            }
            printf("Total amount: $%d.%02d\n", total / 100, total % 100);
        }
        personal_pay.clear();
    }
    
    int main() {
        int d_fare = 0;
        for (int i = 0; i < 24; i++) {
            scanf("%d", &rate[i]);
            d_fare += rate[i];
        }
        d_fare *= 60;
        scanf("%d", &nn);
        char str[10];
        for (int j = 0; j < nn; ++j) {
            scanf("%s%d:%d:%d:%d%s", records[j].name,
                  &records[j].mdhm[0], &records[j].mdhm[1],
                  &records[j].mdhm[2], &records[j].mdhm[3], str);
            if (strlen(str) == LON)
                records[j].state = 0;
            else records[j].state = 1;
        }
        month = records[0].mdhm[0];
        qsort(records, nn, sizeof(Record), cmp);
        char name[22] = "";
        for (int z = 0; z < nn; ++z) {
            if (strcmp(name, records[z].name) == 0) {
                if (records[z - 1].state == 0 && records[z].state == 1) {
                    int md = 0, mh, mm, fare = 0;
                    md = records[z].mdhm[1] - records[z - 1].mdhm[1];
                    mh = (records[z].mdhm[2] - records[z - 1].mdhm[2]);
                    mm = records[z].mdhm[3] - records[z - 1].mdhm[3];
                    fare += md * d_fare;
                    if (mh <= 0) {
                        fare -= d_fare;
                        for (int i = records[z - 1].mdhm[2] + 1; i < 24; ++i) {
                            fare += rate[i] * 60;
                        }
                        for (int i = 0; i < records[z].mdhm[2]; ++i) {
                            fare += rate[i] * 60;
                        }
                    } else {
                        for (int i = records[z - 1].mdhm[2] + 1; i < records[z].mdhm[2]; ++i) {
                            fare += rate[i] * 60;
                        }
                    }
                    int time = md * 24 * 60 + mh * 60 + mm;
                    fare += (60 - records[z - 1].mdhm[3]) * rate[records[z - 1].mdhm[2]];
                    fare += records[z].mdhm[3] * rate[records[z].mdhm[2]];
                    Pay pay = {z - 1, z, time, fare};
                    personal_pay.push_back(pay);
                }
            } else {
                print_payinfo(name);
                strcpy(name, records[z].name);
            }
        }
        print_payinfo(name);
        return 0;
    }
    

    想像一个“时钟”/“进制(各位权重不同,其中小时这一位,每个”单位”权重不同)” ,可以写出较为简洁的 计价函数。
    今天状态是真的不好。。。
    也可以像晴神笔记上那样,一直++进位什么的,好想一些~~

    #include <cstdio>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    int charge24[24], nn, dcharge = 0;
    
    struct Rec {
        string name;
        int dd, hh, mm;
        int type; //on0 off1
        bool operator<(const Rec &r2) const {
            if (name != r2.name)
                return name < r2.name;
            if (dd != r2.dd)
                return dd < r2.dd;
            if (hh != r2.hh)
                return hh < r2.hh;
            return mm < r2.mm;
        }
    } recs[1010];
    
    int getTime(int on, int off) {
        return (recs[off].dd - recs[on].dd) * 24 * 60 +
               (recs[off].hh - recs[on].hh) * 60 +
               recs[off].mm - recs[on].mm;
    }
    
    int getFare(int on, int off) {
        int d1, d2, h1, h2, m1, m2, res = 0;
        d1 = recs[on].dd, d2 = recs[off].dd;
        h1 = recs[on].hh, h2 = recs[off].hh;
        m1 = recs[on].mm, m2 = recs[off].mm;
        res += (d2 - d1) * dcharge;
        int st, ed, rate1;
        if (h2 - h1 < 0) {
            st = h2, ed = h1, rate1 = -1;
        } else {
            st = h1, ed = h2, rate1 = 1;
        }
        int temp = 0;
        while (st < ed) {
            temp += 60 * charge24[st++];
        }
        res += temp * rate1;
        res += (charge24[h2] * m2 - charge24[h1] * m1);
        return res;
    }
    
    int main() {
        for (int i = 0; i < 24; ++i) {
            scanf("%d", &charge24[i]);
            dcharge += 60 * charge24[i];
        }
        scanf("%d", &nn);
        char name[22], type[12];
        int month, tp;
        for (int i = 0; i < nn; ++i) {
            scanf("%s%d:%d:%d:%d%s", name, &month, &recs[i].dd, &recs[i].hh, &recs[i].mm, type);
            if (type[1] == 'n')
                tp = 0;
            else tp = 1;
            recs[i].name = name, recs[i].type = tp;
        }
        sort(recs, recs + nn);
        string curr_user;
        int on, off, total = 0;
        bool printed = false;
        for (int i = 0; i <= nn; ++i) {
            if (curr_user != recs[i].name) {
    
                if (total > 0) {
                    printf("Total amount: $%d.%02d\n", total / 100, total % 100);
                    if (i == nn) break;
                }
                curr_user = recs[i].name;
                printed = false;
                total = 0;
            }
            if (recs[i].name == curr_user && recs[i].type == 0 &&
                recs[i + 1].name == curr_user && recs[i + 1].type == 1) {
                if (printed == false) {
                    printf("%s %02d\n", curr_user.data(), month);
                    printed = true;
                }
                on = i, off = i + 1;
                int price = getFare(on, off);
                total += price;
                printf("%02d:%02d:%02d %02d:%02d:%02d %d $%d.%02d\n",
                       recs[on].dd, recs[on].hh, recs[on].mm,
                       recs[off].dd, recs[off].hh, recs[off].mm,
                       getTime(on, off), price / 100, price % 100);
                i++;
            }
        }
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:结构体排序➕分时计价 | 1016 Phone Bills (2

        本文链接:https://www.haomeiwen.com/subject/fgmgjqtx.html