Educational Codeforces Round 111 (Rated for Div. 2)总结

本文分享了Codeforces比赛中的三道题目:FindTheArray寻找最小元素组合,MaximumCostDeletion优化操作策略,ManhattanSubarrays利用数据结构解决曼哈顿距离问题。通过实例讲解,展示了如何利用数学思维和编程技巧解决实际问题。

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

比赛链接

        Dashboard - Educational Codeforces Round 111 (Rated for Div. 2) - Codeforces

A - Find The Array

题意

        给出一个有n个元素的数组,如果元素不为1的话,那么就询问a[i]-1和a[i]-2是否在数组里面。求给出总数和为s,元素个数最少的是多少。

思路

        最优的情况就是1,3,5,...这样可以“消耗”更多的s,进而能保证元素最少,那么可以看出1+3+5=3^2,也就是这样奇数相加是平方和,那么我们就对s进行判断,如果是完全平方数那么就输出它的根号,如果不是那么输出根号加1.

代码

#include<stack>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
#include<deque>
#include<vector>
#include<iostream>
#include<map>
#include<set>
#include<iomanip>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
using namespace std;
ll GCD(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
const int inf=0x3f3f3f3f;
int n,s,x;
signed main() 
{
    #ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
    IOS
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>s;
        int x=sqrt(s);
        if (x*x==s) cout<<x<<endl;
        else cout<<x+1<<endl;
    }
    return 0;
}

 

B - Maximum Cost Deletion

题意

        给出一个01序列,我们可以让其中连续的(包括1个)0或者1消除,得到一个新的字符串,可以这样一直下去直到没有。题目除了给出长度和字符串外,还给出了a和b两个变量,每一次操作得分为a*l+bl是这个操作中选取的长度。求最大得分。

思路

        我们对a*l+b进行观察,发现无论截取多少次,对于a*l这一项是永远不变的,主要是看b,我们取的或多或少对b有影响很大。如下图:

        \sum_{i=1}^{num} a*l_i+b\;=\;a*\sum_{i=1}^{num}l_i\,+\,\sum_{i=1}^{num}b\;=\;a*n+num*b

        所以我们看b的范围:

        1)b>0。那么我们想要b越来越多,那么我们就一个一个取,这样得分最大。

        2)b<0。那么我们就希望次数越少越好,我们每次选择连续的,扫一遍得到有多少个01段,如果得出来有cnt块,那么不难证明只需要(cnt/2+1)次可以全部消除。

        3)b=0。随便归为哪一类都行。

代码 

#include<stack>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
#include<deque>
#include<vector>
#include<iostream>
#include<map>
#include<set>
#include<iomanip>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
using namespace std;
ll GCD(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
const int inf=0x3f3f3f3f;
const int N = 110;
int sum,num[N];
string st;
int n,a,b,cnt,T;
char tmp;
signed main() 
{
    #ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
    IOS
    cin>>T;
    while (T--)
    {
        cin>>n>>a>>b>>st;
        tmp=st[0];sum=1;cnt=0;
        for (int i=1;i<n;i++)
        {
            if (st[i]!=tmp)
            {
                if (tmp=='0') tmp='1';
                else tmp='0';
                num[++cnt]=sum;
                sum=1;
            }
            else
            {
                sum++;
            }
        }
        num[++cnt]=sum;
        //for (int i=1;i<=cnt;i++) cout<<num[i]<<" ";
        //cout<<endl;
        if (b<0) cout<<b*(cnt/2+1)+a*n<<endl;
        else cout<<(a+b)*n<<endl;
    }
    
    return 0;
}

C - Manhattan Subarrays

题意

        如果一个区间内有三个点p,q,r能满足d(p,r)=d(p,q)+d(q,r),d(i,j)表示的是i和j之间的曼哈顿距离,那么我们就说这个是“坏的”,如果区间长度为1或2,那么这个是“好的”。求长度为n的给出具体数字的数组,有多少个“好的”区间。

思路

        这个题昨天把我搞自闭了...不知道是属于哪个数据结构,想半天想放弃去吃外卖,但是又不想放弃,去往LIS上想...哎

        郎队在群里讲了一下长度为5的绝对不可能,我发现好有道理!!但是自己那时候没打算打了,今天来补。

        经过题目稍微画图分析,发现这三个点满足非严格递增或递减就不行,所以我们只需要将长度为1,2的加上,长度为3,4取判断是否非严格递增即可。

代码

#include<stack>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
#include<deque>
#include<vector>
#include<iostream>
#include<map>
#include<set>
#include<iomanip>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
using namespace std;
ll GCD(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
const int inf=0x3f3f3f3f;
const int N = 200007;
int T,a[N],ans,n;
inline bool check(int a,int b,int c)
{
    if (a<=b&&b<=c) return false;
    if (a>=b&&b>=c) return false;
    return true;
}
signed main() 
{
    #ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
    IOS
    cin>>T;
    while (T--)
    {
        cin>>n;
        for (int i=1;i<=n;i++) cin>>a[i];
        ans=n*2-1;
        for (int i=1;i<=n-3+1;i++)
        {
            if (check(a[i],a[i+1],a[i+2])) ans++;
            if (i<=n-4+1)
            {
                int boo=true;
                if (!check(a[i],a[i+1],a[i+2])) boo=false;
                if (!check(a[i],a[i+1],a[i+3])) boo=false;
                if (!check(a[i],a[i+2],a[i+3])) boo=false;
                if (!check(a[i+1],a[i+2],a[i+3])) boo=false;
                if (boo) ans++;
            }
        }
        cout<<ans<<endl;
    }
    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、付费专栏及课程。

余额充值