Codeforces Round 916 (Div. 3) --- A~E

本文介绍了五道编程题目,涉及计数字符出现频率、序列生成、任务完成策略、活动安排和博弈问题。展示了如何使用C++实现解决方案,涉及map、动态规划、排序等技术。
摘要由CSDN通过智能技术生成
A - Problemsolving Log

题意:

每个字母出现的次数>=给定时间 误区:在几分钟内解决!=竞赛持续时间

思路:

涉及某值出现了几次 ---- map<int, int>

代码:

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

void solve(){
    int n;
    string s;
    cin>>n>>s;
    map<int,int> mp;
    int ans=0;
    for(int i=0;i<n;i++)
        mp[s[i]-'A']++;
    for(int i=0;i<26;++i){
        if(mp[i]>=(i+1)) ans++;
    }
    cout<<ans<<endl;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int test;
    cin>>test;while(test--)
    solve();
    return 0;
}
B - Preparing for the Contest

题意:

找出一个包括全部1~n数字的序列,使得(序列-ab b>a)次数恰好=k

思路:

先正序输出1~k(k-1对),然后从大到小输出剩下的即可

代码:

/*
 * @Author       : 
 * @LastEditTime : 2024-01-08 15:46:45
 */
#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve(){
    int n,k;cin>>n>>k;
    for(int i=1;i<=k;++i) cout<<i<<" ";//k-1对
    for(int i=n;i>k;--i) cout<<i<<" "; //1对
    cout<<endl;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int test;
    cin>>test;while(test--)
    solve();
    return 0;
}
C - Quests --- 卡住了 写题不能犹豫,想到一个方法立马验证,不要来回横跳多个方法

题意:

n个任务,第i个任务被完成前提是1~i-1个任务都被完成了至少一次。

每个任务第一次完成和被重复完成得到的奖励值不同

最大完成任务数<=k

思路:

完成任务数k全用上。重复完成哪个任务可以任意从已经被完成的任务中选择->确定完成到哪个任务结束(所有题目都是要求一个确定的边界 或者是一个公式来判断)

代码:

/*
 * @Author       :  
 * @LastEditTime : 2024-01-08 16:40:06
 */
#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve(){
    int n,k;cin>>n>>k;
    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 sum=a[1],mb=b[1];
    int ans=a[1]+(k-1)*b[1];//易错  初始化的值格外注意!!!
    for(int i=2;i<=n&&i<=k;++i){
        mb=max(mb,b[i]);//易错
        int tmp=sum+a[i]+(k-i)*mb;
        ans=max(ans,tmp);
        sum+=a[i];
    }
    cout<<ans<<endl;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int test;
    cin>>test;while(test--)
    solve();
    return 0;
}
D - Three Activities

题意:

每天都可以从三个项目中选择一个完成,每天个项目的人数不同,要求选择三个不同的天 𝑥,𝑦,𝑧 ,使参加活动的朋友总数( 𝑎𝑥+𝑏𝑦+𝑐𝑧 )达到最大。

思路:

涉及在哪天有多少人--两个值对应=必用pair排序 最大的在前面 三层for循环,每层三次,找到最大的( 𝑎𝑥+𝑏𝑦+𝑐𝑧 ) lambda函数!

代码:

/*
 * @Author       :  
 * @LastEditTime : 2024-01-08 17:28:06
 */
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pi pair<int,int> 

bool cmp(pi& a,pi& b){
    return a.ff>b.ff;
}

void solve(){
    int n;cin>>n;
    vector<pi> a(n+1),b(n+1),c(n+1);
    int ans=0;
    for(int i=0;i<n;i++) {cin>>a[i].ff; a[i].ss=i;}
    for(int i=0;i<n;i++) {cin>>b[i].ff; b[i].ss=i;}
    for(int i=0;i<n;i++) {cin>>c[i].ff; c[i].ss=i;}
    sort(a.begin(),a.end(),cmp);
    sort(b.begin(),b.end(),cmp);
    sort(c.begin(),c.end(),cmp);
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            for(int k=0;k<3;k++){
                if(a[i].ss!=b[j].ss && a[i].ss!=c[k].ss && b[j].ss!=c[k].ss){
                    int tmp=a[i].ff+b[j].ff+c[k].ff;
                    ans=max(ans,tmp);
                }
            }
        }
    }
    cout<<ans<<endl;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int test;
    cin>>test;while(test--)
    solve();
    return 0;
}
E - Game with Marbles --- 博弈论

题意:

一共有n种弹珠,a和b对于每个颜色分别有ai和bi个,a先(a弹出某个色的一个 b对应色的弹珠清零)ans=a珠子总数-b主子总数

思路:

a保留自己多的(选自己最多的色弹-no)->ai与bi的差值影响(no)->一个色要么我选要么你选,我先让你选我再看如果是我选我对结果的影响是多少(a-(ai+bi-2) b-(-ai-bi+2))【并不是答案!所以要用pair存】 ,对ai+bi从大到小排序(两对数据-用pair存) a选奇数,b选偶数。[ans=ai-1 or -(bi-1)]

代码:

/*
 * @Author       : 
 * @LastEditTime : 2024-01-08 22:54:46
 */
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pi pair<int,int>

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];
    vector<pi> v(n+1);
    for(int i=1;i<=n;i++) v[i].ff=a[i],v[i].ss=b[i];
    sort(v.begin(),v.end(),[](pi a,pi b){return a.ff+a.ss>b.ff+b.ss;});
    int ans=0;
    for(int i=0;i<n;++i) {
        if(i%2==0) ans+=v[i].ff-1;
        else ans-=v[i].ss-1;
    }
    cout<<ans<<endl;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int test;
    cin>>test;while(test--)
    solve();
    return 0;
}

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值