【解題報告】Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition)

題目鏈接


A. Bear and Game(Codefoeces 673A)

思路

檢查每兩個有趣時間點,若之間的間隔超過 15 分鐘的話就按照 15 分鐘算並結束檢查時間,否則按照實際間隔時間算。將所有間隔時間累加起來就得到了最終答案。

代碼

#include <bits/stdc++.h>
using namespace std;

const int maxn = 100;
int n, ans, a[maxn];

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    a[n+1] = ans = 90;
    for(int i = 1; i <= n + 1; i++) {
        if(a[i] - a[i-1] > 15) {
            ans = a[i-1] + 15;
            break;
        }
    }
    printf("%d\n", ans);
    return 0;
}

B. Problems for Round(Codefoeces 673B)

思路

如果 35 是相似問題,難度小於 3 的問題都要被分到 div2 ,難度大於 5 的問題都要被分到 div1 。因此可以設置兩個指針,指向序列 1,2,...,n 的某兩個位置。在指針 ml 左邊的都是 div2 的問題,在指針 mr 右邊的都是 div1 的問題。每當輸入 (l,r) 時我們將這個數對按照 lr 大的方式重新排序一下,當 l 大於 ml 時就把 ml 移動到l的位置,當 r 小於 mr 時就把 mr 移動到 r 的位置。當輸入結束後 mlmr 之間的題號就是“自由的題號”,我們可以用計數方法中的“隔板法”算出安排問題的方法數是 mrml

代碼

#include <bits/stdc++.h>
using namespace std;

int n, m, l, r, ml, mr;

int main() {
    scanf("%d%d", &n, &m);
    ml = 1;
    mr = n;
    while(m--) {
        scanf("%d%d", &l, &r);
        if(l > r) {
            swap(l, r);
        }
        ml = max(ml, l);
        mr = min(mr, r);
    }
    printf("%d\n", mr - ml < 0 ? 0 : mr - ml);
    return 0;
} 

C. Bear and Colors(Codefoeces 673C)

思路

暴力枚舉所有區間 [i,j] 。當計算完區間 [i,j] 時,可以通過常數時間計算區間 [i,j+1] 。區間 [i,j+1] 和區間 [i,j+2] 同理。因此就不用再計算每個 [i,j] 時重新統計區間中的顏色個數了。

代碼

#include <bits/stdc++.h>
using namespace std;

const int maxn = 5005;
int n, m, cur, t[maxn], cnt[maxn], ans[maxn];

int main() {
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &t[i]);
    }
    memset(ans, 0, sizeof(ans));
    for(int i = 0; i < n; i++) {
        memset(cnt, 0, sizeof(cnt));
        m = 0;
        for(int j = i; j < n; j++) {
            cnt[t[j]]++;
            if(cnt[t[j]] > m) {
                m = cnt[t[j]];
                cur = t[j];
            }
            if(cnt[t[j]] == m && t[j] < cur) {
                cur = t[j];
            }
            ans[cur]++;
        }
    }
    for(int i = 1; i <= n; i++) {
        printf("%d ", ans[i]);
    }
    puts("");
    return 0;
} 

D. Bear and Two Paths(Codefoeces 673D)

思路

這是個構造問題,所以我們應尋找一種特殊形式來符合題目要求。將圖構造成如下形式就行了。

這裏寫圖片描述

代碼

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1005;
int n, k, s1, s2, t1, t2, m[maxn];

int main() {
    cin >> n >> k >> s1 >> t1 >> s2 >> t2;
    if(n == 4 || k <= n) {
        puts("-1");
        return 0;
    }
    m[s1] = m[t1] = m[s2] = m[t2] = 1;
    printf("%d %d ", s1, s2);
    for(int i = 1; i <= n ;i++) {
        if(m[i] == 0) {
            printf("%d ", i);
        }
    }
    printf("%d %d\n", t2, t1);
    printf("%d %d ", s2, s1);
    for(int i = 1; i <= n; i++) {
        if(m[i] == 0) {
            printf("%d ", i);
        }
    }
    printf("%d %d\n", t1, t2);
    return 0;
}

(其它題目略)

發佈了70 篇原創文章 · 獲贊 30 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章