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;
}
标签:895,int,房间,Codeforces,long,solve,ans,Div
From: https://www.cnblogs.com/du463/p/17688566.html