Codeforces Round 1068 (Div. 2)

A. Sleeping Through Classes

根据题意,定义 res 为还需要休息的天数,初始时为0。枚举一遍字符串 s,如果一节课是重要的,更新 res = k ,若 cnt=0 且该节课不重要, ans++ 

int main() {
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--) {
        int n, k;
        cin >> n >> k;
        string s;
        cin >> s;
        int last = -k - 1; 
        int count = 0;
        for (int i = 0; i < n; ++i) {
            if (s[i] == '1') {
                last = i; 
            } else {
                if (i > last + k) {
                    count++;
                }
            }
        }
        cout << count << endl;
    }
    return 0;
}

B. Niko's Tactical Cards

初始时 k 为0,有两种操作,要么 k-ai,要么 bi-k,要想得到最大值,对于 k-ai,k要尽可能得大,对于 bi-k,k要尽可能得小,遍历数组,每次记录最大值和最小值

max(maxx - a[i], b[i] - minn)

min(minn - a[i], b[i] - maxx)

void solve(){
    int n;
    cin >> n;
    vector<int> a(n + 1), b(n + 1);
    for(int i = 1; i <= n; ++i) cin >> a[i];
    for(int i = 1; i <= n; ++i) cin >> b[i];
    int maxx = 0, minn = 0;
    for(int i = 1; i <= n; ++i){
        int mx = max(maxx - a[i], b[i] - minn);
        int mi = min(minn - a[i], b[i] - maxx);
        maxx = mx, minn = mi;
    }
    cout << maxx << endl;
}

C. Kanade's Perfect Multiples

根据题目,集合B的要求 ai 中至少有一个除数包含在 B 中,bj 中所有小于等于 k 的正倍数在 数组 A中出现。那么集合 B 中,最小的数就是 数组 A 中最小的数。将数组A从小到大排序,记录每个数组A中每个元素标记为 -1,表示集合B不包含该元素,遍历排序后的数组A,当遍历到当前元素的标记为-1时,枚举正倍数,当正倍数在map里的标记为-1时,表示该数在数组A中存在,将它改为1,若遍历到的数map里标记为0时,表示该数在数组A中不存在,违反了规则直接输出-1。若以上条件都满足,则该数就是满足条件的bj,加入集合B,最后输出结果。

void solve(){
    unordered_map<int, int> mp;
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 1);
    for(int i = 1; i <= n; ++i) cin >> a[i], mp[a[i]] = -1;
    sort(a.begin() + 1, a.end());
    vector<int> ans;
    //vector<int> vis(k + 1, 0);
    for(int i = 1; i <= n; ++i){
        if(mp[a[i]] == -1){
            for(int j = a[i]; j <= k; j += a[i]){
                if(mp[j] == 1) continue;
                if(mp[j] == 0){
                    cout << -1 << endl;
                    return ;
                }
                mp[j] = 1;
            }
            ans.push_back(a[i]);
        }
    }
    cout << ans.size() << endl;
    for(auto& x : ans) cout << x << " ";
    cout << '\n';
}

 

posted @ 2025-12-15 09:21  菜鸡の编程日常  阅读(13)  评论(0)    收藏  举报