Codeforces Round 895 (Div. 3)

Codeforces Round 895 (Div. 3)

比赛链接

A. Two Vessels

题目链接
给你三个数a,b,c每次把a,b中较大的数中拿去最多等于c的数给较小的数字,问多少次使得a,b两个数字相等。

A思路:

可恶,在写的过程中出现了精度丢失的情况,导致出现了好多问题,问多少次使得a和b相等,就是

\[abs(a-b)/2/c向上取整 \]

因为这里还需要除以2,导致一部分精度丢失,所以我们可以将c扩大二倍,这样就可以避免这个问题,

\[c*=2; abs(a-n)/c向上取整 \]

A代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

void solve(){
	int a,b,c;
	cin>>a>>b>>c;
	int ans=abs(a-b);
	c*=2;
	cout<<(abs(ans+c-1)/c)<<endl;
	return ;
	
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;

}

B. The Corridor or There and Back Again

题目链接
有一个无限长的走廊,这就意味着有无限多的房间,有个人从一号房出发,要穿过每个房间并且能安全返回1号房,有的房间设置了陷阱,当我们打开有陷阱的房间时候,我们有s秒的移动时间,之后我们就不能穿过设有这个陷阱的地方,问我们最远可以走到哪里。

B思路:

仔细想想我们要想在s秒钟以后不再穿过这个房间是不是就意味着我们只能走到s-1/2的地方,这样我们就可以留一半时间返回并且穿过这个房间,这样一想结果就出来了。

B代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

void solve(){
	int n;
	cin>>n;
	int ans=1e9;
	for(int i=1;i<=n;i++){
		int a,b;
		cin>>a>>b;
		a=a+(b-1)/2;
		ans=min(ans,a);
	}
	cout<<ans<<endl;
	return ;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;

}

C. Non-coprime Split

题目链接
给定两个数l,r,让求两个数a,b使得满足下列要求
l<=a+b<=r
gcd(a,b)!=1

C思路:

需要注意几个条件就可以了,主要看r是奇数还是偶数,如果是偶数直接除以2就是正解,但是当r<4时是没有解的,之后我们需要判断r是奇数的情况,如果l==r就找r的因子d即可,因为d和r-d都可以被d整除,如果l< r直接在其中取一个偶数例如r-1就可以然后除以2.

C代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

void solve(){
	int l,r;
	cin>>l>>r;
	if(r<4){
		cout<<-1<<endl;
		return ;
	}
	if(r%2==0){
		int a=r/2;
		cout<<a<<" "<<a<<endl;
		return ;
	}
	else{
		if(l==r){
			for(int i=2;i*i<=r;i++){
				if(l%i==0){
					cout<<r-i<<" "<<i<<endl;
					return ;
				}
			}
			cout<<-1<<endl;
		}
		else{
			 cout<<r-3<<" "<<2<<endl;
			 return ;
		}
	}
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}
posted @ 2023-09-08 21:09  du463  阅读(19)  评论(0编辑  收藏  举报