Educational Codeforces Round 100 (Rated for Div. 2) A、B题解

原文链接
这场只写出来了两题,赛后看了下C题,复杂的模拟题,不想写,其实是写不来

A 题目链接

题意

有三个怪物,每次操作可以使一个敌人扣一滴血,当此次操作为7的倍数次时,改为特殊攻击,使三个怪物都减一点血,问是否能使用特殊攻击同时消灭三个怪物。

解题思路

首先最后要用特殊攻击消灭怪物,所以三只怪物的总血量得是9的倍数,因为每7次操作,怪物一共会掉9点血。然后要考虑在是否有怪物的血量撑不到最后,意思就是会先被特殊攻击给刮死。
例如:1 3 14
是血量之和9的倍数,无论如何攻击,再第一次特殊攻击时,第一个怪物会先被消灭,所以只要当血量最低的怪物的血量>=特殊攻击的次数即可。特殊攻击的次数为血量之和/9。

代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cctype>
#include<iostream>
#include<algorithm>
//#include<chrono>
#include<vector>
#include<list>
#include<queue>
#include<string>
#include<set>
#include<map>
//#include<unordered_set>
//#include<unordered_map>
#define LL long long
#define li i<<1
#define ri i<<1|1
using namespace std;
inline LL read()
{
    char c=getchar();LL x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
LL t,a[3],sum;
bool init(){
	if(sum%9)
		return false;
	if(a[0]<sum/9)
		return false;
	return true;
}
int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	t=read();
	while(t--){
		a[0]=read();
		a[1]=read();
		a[2]=read();
		sort(a,a+3);
		sum=a[0]+a[1]+a[2];
		if(init())
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}

B 题目链接

题意

有一个长度为n的数组a,S为所有a[i]之和,让你构造一个数组长度为n的数组b,使得2*SUM(abs(a[i]-b[i]))<=S,且对于任何相邻的两个b[i],b[i+1],要么b[i]|b[i+1],要么b[i+1]|b[i],且b[i]>0。(SUM为求和。a|b的意思为a是b的因子。)

解题思路

比赛时想了好久,全部构造为最大值、最小值、中位数、平均数、众数,全都是错误的想法,最后才比赛快结束了才想出来。
把a数组平分为2堆,无论如何分,一定会有一堆之和>=S/2,另一堆之和<=S/2。想到这里,答案就能出来了。
构造值为这样的b数组:
1、a[2]、1、a[4]、1、a[6]、1 …
这样的数组的SUM(abs(a[i]-b[i]))=(a[1]-1)+(a[3]-1)+(a[5]-1)+…。
再构造这样的数组:
a[1]、1、a[3]、1、a[5]、1 …
这样的数组的SUM(abs(a[i]-b[i]))=(a[2]-1)+(a[4]-1)+(a[6]-1)+…。
因为之前的理论,之中一种构造一定能符合答案。

代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cctype>
#include<iostream>
#include<algorithm>
//#include<chrono>
#include<vector>
#include<list>
#include<queue>
#include<string>
#include<set>
#include<map>
//#include<unordered_set>
//#include<unordered_map>
#define LL long long
#define li i<<1
#define ri i<<1|1
using namespace std;
inline LL read()
{
    char c=getchar();LL x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
const int maxn=55;
LL t,n,a[maxn],ans1[maxn],ans2[maxn];
int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	t=read();
	while(t--){
		n=read();
		LL sum=0;
		for(int i=1;i<=n;++i){
			a[i]=read();
			sum+=a[i];
		}
		for(int i=1;i<=n;++i){
			if(i&1){
				ans1[i]=1;
				ans2[i]=a[i];
			}else{
				ans1[i]=a[i];
				ans2[i]=1;
			}
		}
		LL flag1=0,flag2=0;
		for(int i=1;i<=n;++i){
			flag1+=abs(a[i]-ans1[i]);
			flag2+=abs(a[i]-ans2[i]);
		}
		if(2*flag1<=sum){
			for(int i=1;i<=n;++i)
				printf("%lld ",ans1[i]);
			printf("\n");
		}else if(2*flag2<=sum){
			for(int i=1;i<=n;++i)
				printf("%lld ",ans2[i]);
			printf("\n");
		}
	}
	return 0;
}

C 题目链接

题意

有一个机器人,在x坐标轴上行走,在0时刻时0位置。之后有n个命令:在t[i]秒时接受到命令,向目标x[i]位置走去。机器人每秒速度为1。当机器人再行走时,遇到新的指令,它将忽略此条指令。设第i条为好的指令,则满足
机器人再时间t[i]到t[i+1]时,走到过x[i]。默认t[n+1]=+∞。问一共有多少个好的指令。(被忽略的指令也能是好的指令)

写不来,模拟起来感觉很复杂。

"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级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值