Educational Codeforces Round 69 (Rated for Div. 2)

本文解析了四道编程挑战题:DIY木梯、柱子、数组分割及另一个子数组问题。通过代码示例详细介绍了如何求解每一道题目,并提供了清晰的思路指导。

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

A. DIY Wooden Ladder

签到题,比较现在能够有的阶梯数和规定的阶梯数就可以了

    # include <bits/stdc++.h>
    using namespace std;
     
    const int MAXN=1e5+100;
    int a[MAXN];
    int cmp(int a,int b)
    {
    	return a>b;
    }
    int main()
    {
    	int T;
    	scanf("%d",&T);
    	while(T--){
    		int n;
    		int k=0;
    		scanf("%d",&n);
    		for(int i=1;i<=n;i++){
    			scanf("%d",&a[i]);
    		}
    		sort(a+1,a+n+1,cmp);
    		int aa=a[1],bb=a[2];
    		//cout<<"@@"<<aa<<" "<<bb<<endl;
    		int shortt=min(aa,bb)-1;
    		//cout<<"###"<shortt<<endl;
    		for(int i=3;i<=n;i++){
    			if(a[i]>=1){
    				k++;
    			}
    		}
    		k=min(shortt,k);
    		cout<<k<<endl;
    	} 
    	
    	return 0;
     } 

B. Pillars

只要从最大的那个开始向两边都是降序就可以移动,否则不行,(就是一下移动左边的盘,一下移动右边的盘。可能没有讲清楚,画个样例,自己稍微感受一下)

    # include <bits/stdc++.h>
    using namespace std;
     
    const int MAXN=2e5+100;
    int a[MAXN];
    int main()
    {
    	int n;
    	int flag=1;
    	scanf("%d",&n);
    	int maxx=0,maxi=1;
    	for(int i=1;i<=n;i++){
    		scanf("%d",&a[i]);
    		if(a[i]>maxx){
    			maxx=a[i];
    			maxi=i;
    		}
    	}
    	int aa=a[maxi];
    	for(int i=maxi+1;i<=n;i++){
    		if(aa>a[i]){
    			aa=a[i];
    		}else{
    			flag=0;
    			break;
    		}
    	}
    	int bb=a[maxi];
    	for(int i=maxi-1;i>=1;i--){
    		if(bb>a[i]){
    			bb=a[i];
    		}else{
    			flag=0;
    			break;
    		}
    	}
    	if(flag){
    		printf("YES");
    	}else{
    		printf("NO");
    	}
    	
    	return 0;
    }

C. Array Splitting

假设选取做区间右端点的数分别是a,b,c,d,先假设这四个好了,那么上诉式子就是a[a]-a[1]+a[b]-a[a+1]+a[c]-a[b+1]+a[d]-a[c+1],(a[d]==a[n])移项可以知道(a[n]-a[1])+(a[a]-a[a+1])+(a[b]-a[b+1])+(a[c]-a[c+1]),而a[n]-a[1]是定的,所以只要后面最小就可以了

    # include <bits/stdc++.h>
    using namespace std;
     
    const int MAXN=3e5+100;
    int a[MAXN];
    pair<int,int> p[MAXN];
    int main()
    {
    	int n,k;
    	int ans=0;
    	scanf("%d %d",&n,&k);
    	
    	for(int i=1;i<=n;i++){
    		scanf("%d",&a[i]);
    	}
    	
    	if(k==n){
    		printf("0");
    	}else if(k==1){
    		ans=a[n]-a[1];
    		printf("%d",ans);
    	}else{
    		ans=a[n]-a[1];
    		for(int i=1;i<n;i++){
    			p[i].first=a[i]-a[i+1];
    			p[i].second=i;
    		}
    		sort(p+1,p+n+1);
    		for(int i=1;i<k;i++){
    			ans+=p[i].first;
    		}
    		printf("%d",ans);
    	}
    	
    	return 0;
    }

D. Yet Another Subarray Problem

题目中是向上取整的符号,希望读者没有和菜鸡我一样看成向下取整(还被学长批评了一顿,刚好被教练看到,丢人啊 )。读者可以去做一下对大子段和(应该也可以叫最大区间和),这里就是把区间长度限定为m

    # include <bits/stdc++.h>
    using namespace std;
     
    const int MAXN=3e5+100;
    typedef long long LL;
    LL a[MAXN];
    LL pre[MAXN];
    LL dp[MAXN][20];
    int main()
    {
    	int n,m,k;
    	scanf("%d %d %d",&n,&m,&k);
    	
    	for(int i=1;i<=n;i++){
    		scanf("%lld",&a[i]);
    		pre[i]=pre[i-1]+a[i];
    	}
    	LL ans=0;
    	for(int i=1;i<=n;i++){//枚举每一个位置
    		for(int j=1;j<=m;j++){//从这个位置向前取j个,
    			if(j<=i){//这个保证每一次都是要减k的
    				dp[i][j]=max(pre[i]-pre[i-j],pre[i]-pre[i-j]+dp[i-j][m])-k;
    			}
    			ans=max(dp[i][j],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、付费专栏及课程。

余额充值