Codeforces Round #629(div3)

A. Divisibility Problem

题目链接
输出大于或等于a的最小的b的倍数与a的差

ll a,b;
void solve()
{
	rd(a),rd(b);
	cout<<b*ll(ceil(1.0*a/b))-a<<endl;
	/*
	if(a%b==0) cout<<0<<endl;
	else cout<<b*(a/b+1)-a<<endl;
	*/
}

B. K-th Beautiful String

题目链接
很容易观察到,
当左边的B在倒数第2个位置时,
右边的B只能在倒数第1个位置,
b=1;

当左边的B在倒数第3个位置时,
右边的B只能在倒数第1或第2个位置,
b=2或3;

当左边的B在倒数第i个位置时,
右边的B只能在倒数第1,2,3…,i-1个位置,
b=(n-1) * (n-2)/2…n*(n-1)/2;

设左边那个B在倒数第fb个位置,
右边的B与左边的B距离为y

通过计算方程n*(n-1)/2=x
并利用ceil(不小于x的最大整数)
得出fb的值
计算出y的值

void solve()
{
	rd(a),rd(b);
	double x=(1+sqrt(1+8*b))/2;
	ll fb=ceil(x);
	ll y=(fb)*(fb-1)/2-b;
	//cout<<fb<<' '<<y<<endl;
	for(int i=1;i<=a;i++)
	{
		if(a-i+1==fb||i==-fb+a+1+y+1) cout<<'b';
		else cout<<'a';
	}
	cout<<endl;
}

C. Ternary XOR

题目链接
观察样例,很容易看出是贪心

当第一次出现1之前,
2的话各分配1,0的话都是0;
当第一次出现1的时候,
给a数组分配1,b数组分配0;
之后所有的数都分配给b,a都是0;

int n;
string s;
void solve()
{
	rd(n);
	cin>>s;
	string a,b;
	int flag=0;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]=='2') 
		{
			if(flag==0)
				a+='1',b+='1';
			else
				a+='0',b+='2';
		}
		else if(s[i]=='0') a+='0',b+='0';
		else
		{
			if(flag==0)
			{
				flag=1;
				a+='1';
				b+='0';
			}
			else
			{
				a+='0';
				b+='1';
			}
		}
	}
	cout<<a<<endl;
	cout<<b<<endl;
}

D. Carousel

需要讨论的情况比较多,需要自己构造一些样例
容易观察得最多只需要三种颜色就可以了
当且仅当每个木马都相同时,k=1;
当k=2或3时,需要使用到贪心,
因为题目要求相邻的类型不同的颜色不同,
我们直接让所有的奇数项为1,偶数项为2,
唯一需要关注的便在于首项和末项是否冲突。

如果此时n为偶数,首项为1,末项为2,不冲突;

如果n为奇数,那就要让其中一对相邻的数涂同样的颜色,其他照旧12121212循环即可,
此时注意特判开头和结尾相同的情况;

如果没有任意一对相邻的数相同,
直接输出121212121212…3

const int maxn=2e5+10;
int n,temp,i;
int a[maxn];
void solve()
{
	bool flag=true;
	temp=-1;
	rd(n),rd(a[1]);
	for(i=2;i<=n;i++)
	{
		rd(a[i]);
		if(a[i]==a[i-1]) temp=i;
		if(flag==true&&a[i]!=a[i-1]) flag=false;
	}
	if(a[n]==a[1]) temp=0;
	if(flag==true)
	{
		cout<<1<<endl;
		for(i=1;i<=n;i++)
			cout<<1<<' ';
		cout<<endl;
		return;
	}
	if(n%2==0)
	{
		cout<<2<<endl;
		for(i=1;i<=n;i++)
			cout<<(i%2==1?1:2)<<' ';
		cout<<endl;
		return;
	}
	if(temp==-1)
	{
		cout<<3<<endl;
		for(i=1;i<=n-1;i++)
			cout<<(i%2==1?1:2)<<' ';
		cout<<3<<endl;
		return;
	}
	cout<<2<<endl;
	if(temp==0)
	{
		for(i=1;i<=n-1;i++)
			cout<<(i%2==1?1:2)<<' ';
		cout<<1<<endl;
		return;
	}
	for(i=1;i<=temp-1;i++)
		cout<<(i%2==1?1:2)<<' ';
	for(i=temp;i<=n;i++)
		cout<<(i%2==0?1:2)<<' ';
	cout<<endl;
}

EF会补QAQ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值