PAT クラス A ブラッシング質問の記録 - (AcWing) - Day15 (8 つの質問をシミュレートし、1 つの質問をチェック)

PAT クラス A ブラッシング質問の記録 - (AcWing) - Day15 (8 つの質問をシミュレートし、1 つの質問をチェック)

このコースは AcWing から提供されており、
AcWing のタイトルは中国語のタイトルに翻訳されています。

1008 エレベーター

AcWリンク
PATリンク

注意点

#include <iostream>
#include <cstring>

using namespace std;
int n;

int main() {
    
    
    cin >> n;
    int res = 0;
    int cur = 0;
    while (n--) {
    
    
        int x;
        cin >> x;
        if (cur < x)res += (x - cur) * 6;
        else res += (cur - x) * 4;
        res += 5;
        cur = x;
    }
    cout << res << endl;
    return 0;
}

1011 ワールドカップの賭け

AcWリンク
PATリンク

英単語

分析する

注意点

#include <iostream>
#include <vector>

using namespace std;
double w, t, l;

int main() {
    
    
    double res = 1;
    for (int i = 0; i < 3; ++i) {
    
    
        cin >> w >> t >> l;
        double x = max(w, max(t, l));
        if (x == w) cout << "W ";
        else if (x == t) cout << "T ";
        else cout << "L ";
        res *= x;
    }
    printf("%.2lf\n", (res * 0.65 - 1) * 2);
    return 0;
}

1014 列に並んで待っています

AcWリンク
PATリンク

解析
各ウィンドウはキューによって管理され、
キューには各人のサービス完了時間が格納され
、入力されたすべての人物が 1 人ずつキューに追加されます。

  • 入力されたシーケンス番号がn*mより前の場合、キュー番号の順序に従ってキュー内の人数が最も少ない挿入を見つけ、現在のキューの合計終了時刻 (8.00 + キュー内のすべての人のサービス時間) を計算します。
  • 黄色の線の後ろに並びたい人であれば、完了時間が最も早い列(反対側の要素が最も小さい列)を見つける
    1. ターゲットキューをデキューし、キューに入れる現在の人を挿入し、キューの合計終了時間を更新し、現在の人の終了時間をハッシュテーブルに追加します
    2. ここでは、5時までに申請を行った人であるかどうかを判断する必要があります。
  • 最後に、ハッシュ テーブルに従って各人の完了時間をクエリします。

注意点

#include <iostream>
#include <queue>
#include <unordered_map>

using namespace std;
const int N = 30;
int n, m, k, q;
queue<int> windows[N]; // n个窗口
unordered_map<int, int> map; // 顾客编号从1到k
int sum[N]; //每个窗口的总服务时间
int main() {
    
    
    cin >> n >> m >> k >> q;
    for (int i = 1; i <= k; ++i) {
    
    
        int service;
        cin >> service;
        int target = 0;
        for (int j = 0; j < n; ++j) {
    
     //找需要插入的队列
            if (i <= n * m) {
    
    
                // 可以直接加入到队列中, 找排队人数最小的那个队列
                if (windows[j].size() < windows[target].size()) target = j;
            } else {
    
    
                // 要先在黄线后面排队, 找第一个结束服务的队列
                if (windows[j].front() < windows[target].front()) target = j;
            }
        }
        // 此时target为要插入的队列
        int cur_over = sum[target] + service; // 当前顾客的服务完成时间等于队列的总完成时间+自己要服务的时间
        windows[target].push(cur_over);
        sum[target] += service; // 更新队列的总结束时间
        if (i > n * m) windows[target].pop();
        if (sum[target] - service < 540) map[i] = sum[target];
    }
    while (q--) {
    
    
        int id;
        cin >> id;
        if (map.count(id)) printf("%02d:%02d\n", map[id] / 60 + 8, map[id] % 60);
        else puts("Sorry");
    }
    return 0;
}

1031 ハローワールドフォーユー

AcWリンク
PATリンク

英単語

分析
不等式を使用してn1最初に最大値を計算し、出力を順番に除算します。

注意点

 if(res[i][j]) cout << res[i][j];
 else cout << " ";
#include <iostream>

const int N = 100;
using namespace std;
string s;
char res[N][N];

int main() {
    
    
    cin >> s;
    int n = s.size();
    int n1 = min((n + 2) / 3, (n - 1) / 2);
    int n2 = n + 2 - 2 * n1;
    int idx = 0;
    for (int i = 0; i < n1; ++i) {
    
    
        res[i][0] = s[idx++];
    }
    for (int i = 1; i < n2; ++i) {
    
    
        res[n1 - 1][i] = s[idx++];
    }
    for (int i = n1 - 2; i >= 0; i--) {
    
    
        res[i][n2 - 1] = s[idx++];
    }
    for (int i = 0; i < n1; ++i) {
    
    
        for (int j = 0; j < n2; ++j) {
    
    
            if(res[i][j]) cout << res[i][j];
            else cout << " ";
        }
        cout << endl;
    }
    return 0;
}

1041 ユニークであること

AcWリンク
PATリンク

英単語

  • 宝くじ
  • に賭けます

分析する

注意点

#include <iostream>
#include <vector>

const int N = 10010;
using namespace std;
vector<int> num;
int st[N];

int main() {
    
    
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
    
    
        int x;
        cin >> x;
        num.push_back(x);
        st[x]++;
    }
    bool has = false;
    for (auto &x:num) {
    
    
        if (st[x] == 1) {
    
    
            cout << x;
            has = true;
            break;
        }
    }
    if(!has) puts("None");
    return 0;
}

1042 シャッフルマシン

AcWリンク
PATリンク

注意点
void *memcpy(void *str1, const void *str2, size_t n)

  • n バイトを記憶領域 str2 から記憶領域 str1 にコピーします。
#include <iostream>
#include <cstring>

using namespace std;
int card[60], res[60], order[60], k;

void print(int x) {
    
    
    if (x <= 13) cout << "S" << x;
    else if (x <= 26) cout << "H" << x - 13;
    else if (x <= 39) cout << "C" << x - 26;
    else if (x <= 4 * 13) cout << "D" << x - 39;
    else cout << "J" << x - 4 * 13;
}

int main() {
    
    
    cin >> k;
    for (int i = 1; i < 55; ++i) {
    
    
        card[i] = i;
    }
    for (int i = 1; i < 55; ++i) {
    
    
        cin >> order[i];
    }
    while (k--) {
    
    
        memcpy(res, card, sizeof(res)); // card = res
        for (int i = 1; i < 55; ++i) {
    
    
            card[order[i]] = res[i];
        }
    }
    print(card[1]);
    for (int i = 2; i < 55; ++i) {
    
    
        cout << " ";
        print(card[i]);
    }
    return 0;
}

1047 コースの学生リスト

AcWリンク
PATリンク

英単語

解析は保存にも使用
できますvector<string> lessons[N]


最初にタイムアウトがあり、その後はすべてのcin変更がscanf printf正しく行われることに注意してください。

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

unordered_map<int, vector<string>> map;
int n, k;

int main() {
    
    
    scanf("%d %d", &n, &k);
    while (n--) {
    
    
        char name[10];
        scanf("%s", name);
        int cnt;
        cin >> cnt;
        while (cnt--) {
    
    
            int course;
            scanf("%d", &course);
            map[course].push_back(name);
        }
    }
    for (int i = 1; i <= k; ++i) {
    
    
        auto stu_list = map[i];
        printf("%d %d\n", i, stu_list.size());
        sort(stu_list.begin(), stu_list.end());
        for (auto &item:stu_list) {
    
    
            printf("%s\n", item.c_str());
        }
    }
    return 0;
}

1054 ドミナントカラー

AcWリンク
PATリンク

英単語

  • 画像の解像度 画像の解像度

分析する

ポイントの並べ替えは最初に最初のキーワードの昇順で、次に 2 番目のキーワードの昇順であることに注意してください
vector<pair<int,int>>。そのため、ここでは降順を取得したいので、挿入するときにマイナス記号を追加するだけです。

この方法は少し面倒ですが後者の方が良いです

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;
unordered_map<int, int> map;
vector<pair<int, int>> colors;
int m, n;

int main() {
    
    
    cin >> m >> n;
    while (n--) {
    
    
        for (int i = 0; i < m; ++i) {
    
    
            int c;
            cin >> c;
            map[c]++;
        }
    }
    for (auto &item:map) {
    
    
        colors.push_back({
    
    -item.second, item.first,});
    }
    sort(colors.begin(), colors.end());
    cout << colors[0].second << endl;
    return 0;
}

簡単な書き方ですが、入力処理中に現在の色のピクセル数が半分以上あるかどうかを確認します。

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;
unordered_map<int, int> map;
int m, n;

int main() {
    
    
    cin >> m >> n;
    for (int i = 0; i < n * m; ++i) {
    
    
        int x;
        cin >> x;
        if (++map[x] > n * m / 2) {
    
    
            cout << x;
            break;
        }
    }
    return 0;
}

1107 社会クラスター

AcWリンク
PATリンク

注意点
シリアルナンバー1からのいくつかの不具合にご注意ください

#include <iostream>
#include <vector>
#include <algorithm>

const int N = 1010;
using namespace std;
int n;
vector<int> hobby[N];
int p[N];
int cnt[N];

int find(int x) {
    
    
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int main() {
    
    
    cin >> n;
    for (int i = 1; i < n + 1; ++i) {
    
    
        int k;
        scanf("%d: ", &k);
        while (k--) {
    
    
            int id;
            cin >> id;
            hobby[id].push_back(i);
        }
    }
    // 初始化并查集
    for (int i = 1; i < n + 1; ++i) {
    
    
        p[i] = i;
    }
    // 合并并查集
    for (int i = 1; i < N; ++i) {
    
    
        if (hobby[i].size() > 0) {
    
    
            int a = hobby[i][0];
            for (int j = 1; j < hobby[i].size(); ++j) {
    
    
                int b = hobby[i][j];
                // 把所有的b都合并到a里面去
                p[find(a)] = find(b);
            }
        }
    }
    // 统计相同祖先的集合数量
    for (int i = 1; i < n + 1; ++i) {
    
    
        cnt[find(i)]++;
    }
    sort(cnt + 1, cnt + n + 1, greater<int>()); // 从大到小排序
    int k = 1;
    // 找前k个不为0的值,记录集群的数量
    while (cnt[k]) k++;
    cout << k << endl;
    cout << cnt[1];
    for (int i = 2; i < k; ++i) {
    
    
        cout << " " << cnt[i];
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/Weary_PJ/article/details/125074636