Educational Codeforces Round 73 (Rated for Div. 2)

ACM竞赛算法解析
本文解析了四道ACM竞赛题目,包括2048游戏的实现、骑士棋盘布局策略、完美团队的组成以及栅栏美化问题。通过详细的算法分析和代码示例,展示了如何运用数据结构和算法解决实际问题。
A - 2048 Game

题意:问数组中数的组成是否能组成2048,其中的数都是2的幂。
题解:都是2的幂所以将小于2048的数加起来最后能大于等于2048即可。

#include <cstdio>
#include <algorithm>
using namespace std ; 
int main(){
	int t ; 
	scanf ("%d",&t) ; 
	while(t --){
		int n , x , sum = 0 ; 
		scanf ("%d",&n) ;
		for (int i = 0 ; i < n ; ++ i){
			scanf ("%d",&x) ; 
			if (x <= 2048)	sum += x ; 
		}
		if (sum >= 2048)	printf ("YES\n") ; 
		else	printf ("NO\n") ; 
	}
	return 0 ; 
}
B - Knights

题意:蓝色格子可以吃到红色格子的,现有黑白两种棋,问怎么摆放使得白棋可以吃更多黑棋(可重复吃)
在这里插入图片描述
题解:同奇偶行的摆放白棋,其他都是黑棋即可。

#include <cstdio>
int main(){
	int n ; 
	scanf ("%d",&n) ; 
	for (int i = 1 ; i <= n ; ++ i){
		for (int j = 1 ; j <= n ; ++ j){
			if (i%2==1 && j%2==1)	printf ("W") ; 
			else if (i%2==0 && j%2==0)	printf ("W") ;
			else	printf ("B") ; 
		}
		printf ("\n") ;
	}
	return 0 ; 
}
C - Perfect Team

题意:一个三人的队伍里必须要有一个coder 和一个math,剩下一个随意,先给出c m x表示三种人的个数,问最多能组成多少队。
题解:最多的情况是三者相加除于3,但是必须有一个c 和一个m那么就受到这两个数目的限制,两者最少的即为组成最多的队伍,所以两者取最小值即可。

#include <cstdio>
#include <algorithm>
using namespace std ; 
int main(){
	int t ; 
	scanf ("%d",&t) ; 
	while(t --){
		int c , m , x ; 
		scanf ("%d%d%d",&c,&m,&x);
		printf ("%d\n",min((c+m+x)/3,min(c,m))) ;
	}
	return 0 ; 
}
D - Make The Fence Great Again

题意:给出栅栏的每一个高度和增加一米的耗费,要求相邻栅栏的高度不能相同,问耗费最少是多少。
题解:dp[i][0/1/2] 表示该栅栏不增 / 增一米 / 增两米的耗费,因为只是要求相邻不一样高度所以最多也就增两米,
状态转移方程:

for (ll j = 0 ; j < 3 ; ++ j){	//枚举i-1的增长量 
	for (ll k = 0 ; k < 3 ; ++ k){	//枚举i的增长量 
		if (a[i-1]+j != a[i]+k){
			dp[i][k] = min(dp[i][k],dp[i-1][j]+b[i]*k) ;
		}
	}	
}
#include <cstdio>
#include <algorithm>
using namespace std ;
typedef long long ll ;
const int N= 3e5 + 10 ;
const ll INF = 1e18 ; 
ll a[N] , b[N] ;
ll dp[N][3] ; 
int main(){
	int t ; 
	scanf ("%d",&t) ; 
	while(t --){
		ll n ; 
		scanf ("%lld",&n) ;
		for (int i = 1 ; i <= n ; ++ i){
			scanf ("%lld%lld",&a[i],&b[i]) ;
			dp[i][0] = dp[i][1] = dp[i][2] = INF ; 
		}
		dp[1][0] = 0 , dp[1][1] = b[1] , dp[1][2] = 2*b[1] ; 
		for (ll i = 2 ; i <= n ; ++ i){
			for (ll j = 0 ; j < 3 ; ++ j){	//枚举i-1的增长量 
				for (ll k = 0 ; k < 3 ; ++ k){	//枚举i的增长量 
					if (a[i-1]+j != a[i]+k){
						dp[i][k] = min(dp[i][k],dp[i-1][j]+b[i]*k) ;
					}
				}	
			}
		}
		printf ("%lld\n",min(dp[n][0],min(dp[n][1],dp[n][2]))) ;
	}
	return 0 ; 
}


刚看到这道题就觉得是dp但是我只用了dp[i][0/1]来表示状态然后也一直在想如果是a[i-1] == a[i] , a[i]+1==a[i+1] 的情况怎么办 用不用改变a数组什么的。唉,做了这么久的dp还是没做出来还是有些失望的,可能还是题刷的太少了。┭┮﹏┭┮

"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、付费专栏及课程。

余额充值