Codeforces 466 Div2

本文解析了四道编程题的解题思路与实现方法。包括签到题的快速解决、循环与条件判断的综合运用、字符串操作技巧以及序列分析算法等。通过具体的代码示例帮助读者理解每道题目的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A签到题略过。
B虽然不难但仔细讨论起来还挺麻烦的,不想清楚容易GG。
这里写图片描述

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    long long n,k,a,b,i,j;
    cin>>n>>k>>a>>b;
    long long x;long long cost=0;
    while(1){
        x=n/k*k;
        cost+=(n-x)*a;
        n=x;
        if(b>=(n-n/k)*a)break;
        n/=k;cost+=b;
    }
    cout<<cost+(n-1)*a<<endl;

    return 0;
}

C.并不难

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
struct cmp {
    bool operator()(char a, char b) {
        return a > b;
    }
};
int main()
{
    string str,str1;
    int n,k,i,j;
    cin>>n>>k;getchar();getline(cin,str);
    set<char,cmp>s;//记录出现过的字符,并且从大到小排列
    for(i=0;i<n;i++)s.insert(str[i]);
    if(k>n){//如果目标字符串更长,显然在原串后面接上最小的字符补齐长度即可
        string str2(k-n,*s.rbegin());str+=str2;cout<<str<<endl;return 0;
    }
    int pos=min(n,k)-1;
    while(str[pos]==*s.begin()){//否则,从后往前,找到第一个可以放更大字符的地方,这样弄出来的字符串一定是最小的.
        pos--;
    }
    str1=str.substr(0,pos);
    auto a=s.begin();
    for(;*a!=str[pos];a++);
    a--;str1+=*a;string str2(k-pos-1,*s.rbegin());
    str1+=str2;
    cout<<str1<<endl;

    return 0;
}

D.
简单分析可以发现以下事实:
这里写图片描述
其中的1,3是可以不用考虑的,因为我们只是想知道l的最小值与r的最大值。同时,可以发现在序列中的数必然是4个4个一样的数连着出现的,也就是一定是0000111100000000这样。可以很快写出代码:
注意题目答案可能很多

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
    int n,i,j,k,num[100005];string str;
    cin>>n;
    for(i=1;i<=n;i++)scanf("%d",&num[i]);getchar();
    getline(cin,str);int l=-1e9,r=1e9;
    for(i=2;i<=n;i++){
        if(str[i-1]!=str[i-2]){
            if(str[i-1]=='1') {
                for (j = i - 4; j <= i; j++)
                    l=max(l,num[j]+1);
            }
            else{
                for(j=i-4;j<=i;j++)
                    r=min(r,num[j]-1);
            }
        }
    }
    cout<<l<<' '<<r<<endl;

    return 0;
}
### 关于Codeforces编号为997的Div.2比赛的信息 #### 比赛概述 Codeforces编号为997的比赛属于Div.2级别,即面向较低评级选手的比赛。这类比赛通常包含多个编程挑战题目,旨在测试参赛者的算法设计能力和编码技巧。 #### 题目列表及其解决方案概览 ##### A. Multiple Testcases 此题描述了一个场景,在准备好的一系列单个测试案例基础上被要求转换成多组输入输出形式的任务[^1]。对于此类问题,处理方式涉及读取多次输入直到遇到特定终止条件为止,并针对每次输入执行相同逻辑操作后给出相应结果。 ```cpp #include <iostream> using namespace std; int main(){ int t; cin >> t; while(t--){ // 处理每一组数据... cout << "Result\n"; } } ``` ##### B. Valera and Contest 该题目设定围绕着Valera参加的一场竞赛展开,其中涉及到如何计算朋友间共同完成项目的数量[^3]。解决方法依赖于解析给定的数据集来统计满足一定条件下可以合作成功的项目数目。 ```cpp // 假设已经定义好了必要的变量和函数用于接收并处理输入数据... for (int i = 0; i < n; ++i){ if ((a[i] && b[i]) || (!a[i] && !b[i])){ count++; } } cout << count << endl; ``` ##### C. Problem with Priority Queue Implementation 考虑到提到贪心策略加上优先队列的应用背景,这里假设存在一道关于实现或应用优先队列解法的问题。这可能意味着要构建一个能够高效管理元素进出顺序的数据结构实例。 ```cpp priority_queue<int> pq; pq.push(5); pq.push(1); pq.push(10); while(!pq.empty()){ cout << pq.top() << ' '; pq.pop(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值