Educational Codeforces Round 84 (Rated for Div. 2) 题解

题目链接

A.Sum of Odd Integers

题目大意:给你两个正整数n和k。让你判断能否找到k个不同的正奇数使得它们的和为n。
题解:容易得出k各不同的正奇数之和至少为 k ∗ k k*k kk(即1,3,5…2k-1),所以n必须满足 n > = k ∗ k n>=k*k n>=kk。然后k个奇数之和奇偶性是确定的,还要满足 n n n% 2 = = k 2==k 2==k% 2 2 2(注意 k ∗ k k*k kk会爆 i n t int int)。

#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false)
typedef long long ll;
const int maxn=1e5+5;
const int mod=1e9+7;
 
void solve()
{
ll n,k;
scanf("%lld %lld",&n,&k);
if(n>=k*k&&(n-k*k)%2==0)
	printf("YES\n");
else printf("NO\n");
}
int main()
{
	int t;scanf("%d",&t);while(t--)
	solve();
	return 0;
}

B.Princesses and Princes

题目大意:有 n n n个公主和 n n n个王子,编号都为 1 1 1~ n n n。每个公主都只愿意和部分王子结婚,并且她们会优先选择编号较小的王子,每个王子只能被选择一次。我们会让编号较小的公主开始先做选择,知道所有公主选择完毕。但是这样可能会导致剩下一些公主和王子没配对,这时候你作为国王可以让一个公主再爱上一个王子,尽可能多的增加配对数。
题解:先看一下能不能完全匹配,如果不能,在没有匹配当中任意输出一个公主和王子就好了,保证能多增加一对。

#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false)
typedef long long ll;
const int maxn=1e5+5;
const int mod=1e9+7;
 
vector<int> v[maxn];
set<int> si;
void solve()
{
int n;
scanf("%d",&n);
si.clear();
for(int i=1;i<=n;i++)
	v[i].clear();
for(int i=1;i<=n;i++)
{
	int k;
	scanf("%d",&k);
	for(int j=1;j<=k;j++)
	{
		int temp;
		scanf("%d",&temp);
		v[i].push_back(temp);
	}
}
int ans1=0,ans2=0;
for(int i=1;i<=n;i++)
{
	int j;
	for(j=0;j<v[i].size();j++)
	{
		if(!si.count(v[i][j]))
		{
			si.insert(v[i][j]);
			break;
		}
	}
    if(j==v[i].size()&&!ans1)
      ans1=i;
}
if(!ans1)
printf("OPTIMAL\n");
else {
	printf("IMPROVE\n");
	for(int i=1;i<=n;i++)
		if(!si.count(i))
		{
			ans2=i;
			break;
		}
	printf("%d %d\n",ans1,ans2);
}
}
int main()
{
	int t;scanf("%d",&t);while(t--)
	solve();
	return 0;
}

C.Game with Chips

题目大意:在一个 n ∗ m n*m nm的网格中有k个碎片,给你每一个碎片的起点坐标以及他们需要到达的终点坐标。你有四种操作,分别是将所有碎片向上、向下、向左、向右移动一个单位(但不能超出边界)。要求你给出一种操作方案使的每一个碎片到达过自己所对应的终点,且要求操作数不能超过 2 m n 2mn 2mn
题解:这道题目看上去很难,好像要没一个碎片单独考虑。然而其实你只要先把所有碎片汇集到同一个格子比如左上角(做多需要 n + m − 2 n+m-2 n+m2步操作),然后你就可以让所有碎片一起动,遍历完所有方格就好了。总共需要 m n + m + n − 3 mn+m+n-3 mn+m+n3步操作,肯定是比题目所要求的 2 m n 2mn 2mn要小的。

#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false)
typedef long long ll;
const int maxn=1e5+5;
const int mod=1e9+7;
 
void solve()
{
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
int x,y;
for(int i=1;i<=k;i++)
scanf("%d %d",&x,&y);
for(int i=1;i<=k;i++)
scanf("%d %d",&x,&y);
printf("%d\n",m*n+m+n-3);
for(int i=1;i<=m-1;i++)
	printf("L");
for(int i=1;i<=n-1;i++)
	printf("U");
for(int i=1;i<=m;i++)
{
	if(i&1)
	for(int i=1;i<=n-1;i++)
		printf("D");
	else 
	for(int i=1;i<=n-1;i++)
		printf("U");
	if(i!=m)
	printf("R");
    else printf("\n");
}
}
int main()
{
	//int t;scanf("%d",&t);while(t--)
	solve();
	return 0;
}

D.Infinite Path

没做出来

E.Count The Blocks

题目大意:有一串整数,从 0 0 0 1 0 n − 1 10^n-1 10n1。如果该数不足n位的则在其前面用0补足。长度为L的块的定义为在一个数中连续L位数字为相同的数字,且不能向左右扩展(这一段左右没有数字或数字不同)。让你分别求出长度为1到长度为n的块的数目,答案对 998244353 998244353 998244353取余。
题解:首先长度为n的块的数目很好求,很明显是 10 10 10。然后从后往前推你就会发现能推出公式。 a n s = 10 ∗ 9 ∗ 2 ∗ 1 0 ( n − i − 1 ) + 9 ∗ 9 ∗ ( n − i − 1 ) ∗ 1 0 ( n − i − 2 ) ans=10*9*2*10^{(n-i-1)}+9*9*(n-i-1)*10^{(n-i-2)} ans=109210ni1)+99ni110(ni2)(i=n和i=n-1时候需要特殊判断)。

#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false)
typedef long long ll;
const int maxn=1e5+5;
const int mod=998244353;
 
ll pow_bound(ll a,ll k)
{
	if(k==0)
		return 1;
	ll temp=pow_bound(a,k/2);
	ll ans=temp*temp%mod;
	if(k&1)
		ans=ans*a%mod;
	return ans;
}
 
void solve()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
	if(i==n)
	{
		printf("10\n");
		continue;
	}
	if(i==n-1)
	{
		printf("180 ");
		continue;
	}
	ll ans=0;
	ans+=10*9*2*pow_bound(10,n-i-1);
	ans%=mod;
	ans+=10*9*9*(n-i-1)*pow_bound(10,n-i-2);
    ans%=mod;
    printf("%lld",ans);
    if(i==n)
    	printf("\n");
    else printf(" ");
}
}
int main()
{
	//int t;scanf("%d",&t);while(t--)
	solve();
	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、付费专栏及课程。

余额充值