Educational Codeforces Round 42 (Rated for Div. 2)

本文提供了四道算法题目的详细解答过程,包括寻找数组中超过一半的元素、最大化的座位安排、通过删除数字获得完全平方数及合并重复数值等,涉及前缀和、贪心算法、枚举和哈希表等技巧。

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

A.
记录一下前缀和,二分找一下超过一半的地方就行了。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,i,j,sum[200005]={0};
    cin>>n;
    for(i=1;i<=n;i++){
        scanf("%d",&j);
        sum[i]+=sum[i-1]+j;
    }
    int half=sum[n]/2;if(sum[n]&1)half++;
    int len=lower_bound(sum+1,sum+1+n,half)-sum;
    cout<<len<<endl;

    return 0;
}

B.
注意细节即可;

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<string>
using namespace std;
int main()
{
    int n,a,b,i,j,k;
    cin>>n>>a>>b;string str;cin>>str;
    priority_queue<int>que;//存放所有空闲位置的长度
    for(i=0;i<str.size();i++){
        if(i<str.size()&&str[i]=='.'){
            int cnt=0;
            while(i<str.size()&&str[i]=='.'){
                cnt++;i++;
            }
            que.push(cnt);
        }
    }
    int cnt=0;
    while(que.size()&&que.top()!=1){//在空闲位置长度大于1之前都要考虑不相邻问题
        int t=que.top();que.pop();
        if(a==0&&b==0)break;
        if(a-t/2>=0)a-=t/2,cnt+=t/2;
        else cnt+=a,a=0;
        if(b-t/2>=0)b-=t/2,cnt+=t/2;
        else cnt+=b,b=0;
        if(t&1){
            if(a>=b&&a)a-=1,cnt+=1;
            else if(b)b-=1,cnt+=1;
        }
    }
    int total=0;
    if(que.size()&&(a+b)){//如果还有长度为1的位置,并且人也没放完
        while(!que.empty()){
            total+=que.top();que.pop();
        }
    }
    cnt+=min(a+b,total);
    cout<<cnt<<endl;

    return 0;
}

C.
数据不大,最多2e9,所以直接枚举每一位要不要删去即可,最多也就2^9种,用一个二进制数来记录删去的位。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<map>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int n,i,j,k;
    cin>>n;int m=n;i=0;map<int,int>ys;
    while(m){
        j=m%10;ys[1<<i]=j;
        m/=10;i++;
    }
    int cnt=i;
    int maxwei=(1<<i)-1;int minn=0x7f7f7f7f;
    for(i=1;i<=maxwei;i++){
        j=i;int num=0;bool iszero=false;
        vector<int>temp;
        while(j){
            k=j&-j;j-=k;
            temp.push_back(ys[k]);
            if(!ys[k])iszero=true;
            else if(ys[k]&&iszero)iszero=false;
        }
        if(iszero)continue;
        else{
            reverse(temp.begin(),temp.end());
            for(auto i=temp.begin();i!=temp.end();i++)
                num=num*10+*i;
            int w=sqrt(num);
            if(w*w==num){
                j=i;int cnt1=0;
                while(j){
                    j-=j&-j;cnt1++;
                }
                minn=min(minn,cnt-cnt1);
            }
        }
    }
    if(minn<0x7f7f7f7f)
        cout<<minn<<endl;
    else cout<<-1<<endl;

    return 0;
}

D.
我们使用一个map来记录每个数值出现的位置,那么如果任何一个数值出现了第二次,它一定会与第一次出现的位置上的数发生合并。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
map<ll,int>pos;//第一个键值是数值,第二个是数值出现的位置
ll a[150005];//用于存读取的数
int main()
{
    int n,i,j;
    cin>>n;int ans=n;
    for(i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        while (pos[a[i]]!=0){//如果这个数值出现过了
            a[pos[a[i]]]=0;//第一次出现的位置清楚
            ans--;
            pos[a[i]]=0;//当前位置清除,因为很可能合并之后的数值又是出现过的
            a[i]*=2;
        }
        pos[a[i]]=i;
    }
    cout<<ans<<endl;
    for(i=1;i<=n;i++)
        if(a[i])
            printf("%lld%c",a[i],i==n?'\n':' ');

    return 0;
}
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值