ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #778 (Div. 1 + Div. 2, based on Technocup 2022 Final Round)

2022-03-21 10:33:42  阅读:180  来源: 互联网

标签:cnt based cout int ++ Div yes Round define


Codeforces Round #778 (Div. 1 + Div. 2, based on Technocup 2022 Final Round)

A

题意

进行一次翻转,求相邻两数最大和

思路

总可以将最大的两个凑一起

#include<bits/stdc++.h>
#define yes puts("yes");
#define inf 0x3f3f3f3f
#define ll long long
#define linf 0x3f3f3f3f3f3f3f3f
#define debug(x) cout<<'>' << ' ' << x<<endl;
#define ull unsigned long long
#define endl '\n'
#define lowbit(x) x&-x
#define int long long
using namespace std;
typedef pair<int,int> PII;
const int MAXN =10 + 2e5 ,mod=1e9 + 7;

void solve()
{    
    int N;
    cin >> N;
    vector<int> a(N);
    for(int i = 0;i < N;i ++) cin >> a[i];
    sort(a.begin(),a.end());
    cout << a[N - 1] + a[N - 2] << endl;
}
signed main()
{
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

    int T;cin>>T;
    while(T--)
        solve();

    return 0;
}

B

题意

每次删除一个字符串的极长重复前缀,

重复前缀指可以在后面找到一个与它相同且不相交的子串

求删到最后剩什么

思路

如果该字母只有一个,显然不可删

考虑删除一个极长前缀,可以变成多次删一个字符的操作

所以只要这个字符串中的同类字符大于一,这个字符就是可删的

#include<bits/stdc++.h>
#define yes puts("yes");
#define inf 0x3f3f3f3f
#define ll long long
#define linf 0x3f3f3f3f3f3f3f3f
#define debug(x) cout<<'>' << ' ' << x<<endl;
#define ull unsigned long long
#define endl '\n'
#define lowbit(x) x&-x
#define int long long
using namespace std;
typedef pair<int,int> PII;
const int MAXN =10 + 2e5 ,mod=1e9 + 7;

void solve()
{    
    string s;
    cin >> s;
    vector<int> cnt(26);
    for(int i = 0;i < s.size();i ++) {
        cnt[s[i] - 'a'] ++;
    }
    int st = 0;
    for(int i = 0;i < s.size();i ++) {
        if(cnt[s[i] - 'a'] > 1) {
            cnt[s[i] - 'a'] --;
            st ++;
        }else break;
    }
    for(int i = st;i < s.size();i ++) {
        cout << s[i] ;
    }
    cout << endl;
}
signed main()
{
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

    int T;cin>>T;
    while(T--)
        solve();

    return 0;
}

C

题意

把一个数等分 $N - 1 $ 次,如果这个数是奇数,按上下取整等分

现在给出操作结果,问是否合法

思路

第一思路是开一个小根堆,每次取出最小的两个,合并它们看是否满足要求

但可以发现拆分策略不是优先合并最小值

不考虑过程,可以发现这个操作的终止状态和起始状态都十分明确

向上合并的策略不好发现,不妨向下拆分

显然最大的数字一定最先被拆出来,设当前未被拆出的最大值为 \(x\)

所以就维护大根堆,拿出队首 $ mx $ ,和 $ x $ 比较

如果 $ mx $ 较小,显然无论如何都凑不出

如果 $mx $ 和 $ x $ 相同,固定这个 \(mx\) ,不再对它拆分,更新当前 $mx $ 和 \(x\)

如果大,那无论如何都要将它继续拆分

如果拆分 \(n - 1\) 次后合法,则输出 YES。

如果发现,大的数总是先被拆出以及如果当前数大就一定要继续拆分,当前数小,就说明不再有拆出这个数的可能,就非常显然了。

#include<bits/stdc++.h>
#define yes puts("yes");
#define inf 0x3f3f3f3f
#define ll long long
#define linf 0x3f3f3f3f3f3f3f3f
#define debug(x) cout<<'>' << ' ' << x<<endl;
#define ull unsigned long long
#define endl '\n'
#define lowbit(x) x&-x
#define int long long
using namespace std;
typedef pair<int,int> PII;
const int MAXN =10 + 2e5 ,mod=1e9 + 7;

void solve()
{    
    int N;
    cin >> N;
    vector<int> a(N + 1);
    int sum = 0;
    for(int i = 1;i <= N;i ++) {
        cin >> a[i];
        sum += a[i];
    }
    if(N == 1) {
        cout << "YES\n";
        return;
    }
    sort(a.begin() + 1,a.end());
    
    int cnt = 0;
    priority_queue<int> q;
    q.push(sum);
    while(cnt != N) {
        int t = q.top();
        q.pop();
        if(t == a.back()) {
            a.pop_back();
            cnt ++;
        }else if(t > a.back()) {
            q.push(t / 2);
            q.push((t + 1) / 2);
            // cnt += 2;
        }else {
            cout << "NO\n";
            return;
        }
    }
    cout << "YES\n";
}
signed main()
{
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

    int T;cin>>T;
    while(T--)
        solve();

    return 0;
}

D

题意

$ N $ 种配料,给出它们的比例,保证每种配料都受到约束,共给出 \(N - 1\) 个比例关系。

问为使得配料在满足给出比例情况下,各个配料的最小整数解的和是多少

思路

待补

标签:cnt,based,cout,int,++,Div,yes,Round,define
来源: https://www.cnblogs.com/Mxrush/p/16033571.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有