• 周四. 2月 29th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

$Codeforces$ $Round$ $739$ $Div.3$ 简要题解

admin

11月 28, 2021

一时兴起,打了个 (Div3) ,果然是老年退役选手, (Div3) 只能切前三题了。只能说,道阻且长啊。

(A) (Dislike) (of) (Threes)

解法

(1) 开始枚举正整数,筛掉满足 (x equiv 3 (mod 10))(x equiv 0 (mod 3)) 的正整数 (x) ,筛出 (1000) 个即可。

(Code)

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int ret=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		ret=(ret<<1)+(ret<<3)+ch-'0';
		ch=getchar();
	}
	return ret*f;
}
int t,k,num,a[1005];
int main()
{
	t=read();
	for(register int i=1;i<=5000;i++)
	{
		if(i%3==0||i%10==3)
			continue;
		num++;
		a[num]=i;
		if(num==1000)
			break;
	}
	for(register int i=1;i<=t;i++)
	{
		k=read();
		printf("%d
",a[k]);
	}
	return 0;
}

(B) (Who’s) (Opposite?)

解法

(2|a-b|) 为环长(记为 (2r) )。设答案为 (d) ,则合法的 (d=d+r)(d=d-r)(d)([1,2n](d in N_+)) 之间。

(Code)

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int ret=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		ret=(ret<<1)+(ret<<3)+ch-'0';
		ch=getchar();
	}
	return ret*f;
}
int t,a,b,c,d,r;
int main()
{
	t=read();
	for(register int i=1;i<=t;i++)
	{
		a=read();
		b=read();
		c=read();
		r=abs(a-b);
		if(a>2*r||b>2*r||c>2*r)
		{
			printf("-1
");
			continue;
		}
		d=c-r;
		if(d>0&&d<=2*r)
		{
			printf("%d
",d);
			continue;
		}
		d=c+r;
		if(d>0&&d<=2*r)
		{
			printf("%d
",d);
			continue;
		}
		printf("-1
");
	}
	return 0;
}

(C) (Infinity) (Table)

解法

考虑把 (k)拆成 (a^2+b(a,b in N,b in [0,2a])) 的形式。 (b leqslant a+1) 时, (k)((b,a+1)) ; (b>a+1) 时, (k)((a+1,2a-b+2))

(Code)

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int ret=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		ret=(ret<<1)+(ret<<3)+ch-'0';
		ch=getchar();
	}
	return ret*f;
}
int t,k,a,b,r,c,x[40005];
int main()
{
	t=read();
	for(register int i=1;i<=40000;i++)
		x[i]=i*i;
	for(register int i=1;i<=t;i++)
	{
		k=read();
		if(k==2)
		{
			printf("1 2
");
			continue;
		}
		if(k==3)
		{
			printf("2 2
");
			continue;
		}
		for(register int j=1;j<=40000;j++)
		{
			if(k<x[j])
			{
				a=j-1;
				break;
			}
		}
		b=k-x[a];
		if(b==0)
		{
			printf("%d %d
",a,1);
			continue;
		}
		if(b<=a+1)
		{
			r=b;
			c=a+1;
		}
		else
		{
			r=a+1;
			c=2*a+2-b;
		}
		printf("%d %d
",r,c);
	}
	return 0;
}

未完待续

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注