自学内容网 自学内容网

codeforcese round 957 div3

没申请留校,恰好碰见宿管巡楼,把隔壁寝没申请的留校的宿舍给一锅端了,吓得我直接关灯关电脑,再加上nt的真人验证,要掉大分了

A only pluses

问题:

思路:暴力枚举乘的次数

代码:

#include <bits/stdc++.h>

using namespace std;

void solve() {
    long long a, b, c;
    cin >> a >> b >> c;
    int all = 5;
    long long ans = 0;
    for(int i = 0; i <= 5; i ++ ) {
        for(int j = 0; j <= 5; j ++ ) {
            for(int k = 0; k <= 5; k ++ ) {
                if(i + j + k == 5) {
                    ans = max(ans, (a + i) * (b + j) * (c + k));
                }
            }
        }
    }
    cout << ans << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}

B angry monk

问题:

思路:对于每个数x拆成x个1要x - 1步,合并要x步,因此一个数x的贡献就是2 * x - 1。并且有一个数不用拆,因为所有拆分后的数都要合并到这个数上,如果步数最小,保留最大值即可

代码:

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n, k;
    cin >> n >> k;
    vector<int> a(k + 1);
    for(int i = 1; i <= k; i ++ ) cin >> a[i];
    
    int ans = 0;
    sort(a.begin() + 1, a.end());
    
    for(int i = k - 1; i >= 1; i -- ) {
        ans += a[i];
        ans += a[i] - 1;
    }
    cout << ans << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}

C Gorilla and Permutation

问题:

思路:要让f尽可能的大,g尽可能的小

f[i]表示a[i] >= k的前缀和 因此f尽可能的大,让最大的数在最前面,从n排到k即可

g[i]表示a[i] <= m的前缀和 因此g尽可能的小, 让m排到最后面,从m排到1从后往前排即可

怎么这两段处理交叉,或者不交叉的情况,开个st数组对序列判重,先输出n 到 k,再输出没有被判重的代码块,再从1到m中输出没有被输出的

代码:

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    
    vector<int> a, b, c;
    vector<bool> st(n + 1);
    for(int i = k; i <= m; i ++ ) c.push_back(a[i]);
    for(int i = n, j = m; i >= k || j >= 1; ) {
        if(i >= k) {
            if(!st[i]) {
                a.push_back(i);
                st[i] = 1;
            }
            i --;
        }
        
        if(j >= 1) {
            if(!st[j]) {
                b.push_back(j);
                st[j] = 1;
            }
            j --;
        }
    }
    
    for(auto t: a) cout << t << " ";
    for(int i = 1; i <= n; i ++ ) {
        if(!st[i]) cout << i << " ";
    }
    reverse(b.begin(), b.end());
    for(auto t: b) cout << t << " ";
    cout << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}

D TEST of love

问题:

思路:要尽可能的往木头上跳,如果不能跳到木板上,那么就按跳的最大距离跳到水中,游到下一个木板,并在这一段游泳的过程中判断是否遇到鳄鱼,以及游泳距离

代码:


#include <bits/stdc++.h>
 
using namespace std;
 
void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    string s;
    cin >> s;
    s = 'L' + s + 'L';
    vector<int> pos;
    pos.push_back(0);
    for(int i = 1; i <= n; i ++ ) {
        if(s[i] == 'L') pos.push_back(i);//记录木头位置
    }
 
    pos.push_back(n + 1);//岸
    
    int j = 0;
    bool flag = true;
    bool in_L = true;
    int cnt = k;
    for(int i = 0; i <= n; i ++ ) {
        if(in_L) {
            if(pos[j] + m < pos[j + 1]) {
                in_L = false;
                i = pos[j] + m;
            } else if(pos[j] + m >= pos[j + 1]) {
                i = pos[j + 1];
                j ++;
                in_L = true;
            }
        }
        
        if(!in_L) {
            if(s[i] == 'W') cnt --;
            else if(s[i] == 'C') {
                flag = false;
                break;
            } else if(s[i] == 'L') {
                j ++;
                i = pos[j];
                in_L = true;
            }
        } else i --;
    }
    
    if(cnt < 0) flag = false;
    if(flag) cout << "Yes" << endl;
    else cout << "No" << endl;
}
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}


E Novice's Mistake

问题:

思路:

代码:

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n;
    cin >> n;

    int len = 0;
    int tmpn = n;
    while(tmpn) {
        len ++;
        tmpn /= 10;
    }
    
    string str = to_string(n);
    vector<pair<int, int>> ans;
    for(int a = 1; a <= 10000; a ++ ) {//枚举a
        string s = str;//a * n的字符串
        int tmp = a - 1;
        while(s.size() <= 6 && tmp -- ) {
            s += str;
        }
        
        int totlen = a * len;
        for(int i = 1; i <= min(6, totlen); i ++ ) {
            string s1 = s.substr(0, i);
            int b = totlen - i;
            string s2 = to_string(a * n - b);
            if(s1 == s2 && b != 0) ans.push_back({a, b});
        }
    }
    
    cout << ans.size() << endl;
    for(auto t: ans) {
        cout << t.first << " " << t.second << endl;
    }
}

int main() {
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}

F

问题:

思路:

代码:
 

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 1);
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    int ans = 1;
    map<int, int> now;
    for(int i = 1; i <= n; i ++ ) {
        bool flag = true;
        if(k % a[i] == 0 && a[i] != 1) {
            if(now.empty()) {
               now[a[i]] ++;
            } else {
                queue<int> stk;
                for(auto t: now) {
                    long long x = t.first * a[i];
                    if(x < k) stk.push(x);
                    else if(x == k) flag = false;
                }
                
                while(stk.size()) {
                    int t = stk.front();
                    stk.pop();
                    now[t] ++;
                }
                now[a[i]] ++;
            }
        }
        if(!flag) {
            ans ++;
            now.clear();
            i --;
        }
    }
    cout << ans << "\n";
    //cout << ma.size();
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}


原文地址:https://blog.csdn.net/2201_75845839/article/details/140385967

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!