Codeforces Round 895 (Div. 3)
Problem - A - Codeforces
你有两个装水的容器。第一个容器装有 a克水,第二个容器装有 b克水。这两个容器都很大,可以装任何数量的水。
你还有一个空杯子,可以装多达c克的水。
只需一个动作,你就可以从任何一个容器中舀出多达 c克的水,并把它倒入另一个容器中。注意,一次倒入的水的质量不一定是整数。
要使两个容器中水的质量相等,最少需要走多少步?请注意,除了所述的动作外,您不能进行其他任何操作。
模拟即可,每次水少的杯子从水多的杯子得到c升水,记录该操作次数即可;
A
#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
int gcd(int a,int b){ return b==0 ? a : gcd(b,a%b); }
int lcm(int a,int b){ if(a==0||b==0) return 0; return (a*b)/gcd(a,b); }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
inline void solve(){
int a,b,c;
cin >> a >> b >> c;
int x = max(a,b);
int y = min(a,b);
int ans = 0;
while(y < x){
ans ++;
y+=c;
x-=c;
}
cout << ans << endl;
}
int main()
{
IOS
int _;
cin >> _;
// _ = 1;
while(_ --) solve();
return 0;
}
Problem - B - Codeforces
枚举每一个陷阱,循环更新答案为(d[i]+len[i])的最小值,就是能走到最远的安全距离;
当s[i]为偶数 : len[i] = s[i] / 2 -1;
当s[i]为奇数 : len[i] = s[i] /2 ,然后下取整;
这样遍历模拟即可;
b
#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
int gcd(int a,int b){ return b==0 ? a : gcd(b,a%b); }
int lcm(int a,int b){ if(a==0||b==0) return 0; return (a*b)/gcd(a,b); }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 205;
int d[N],s[N];
inline void solve(){
int n; cin>>n;
int ans = 10086;
for(int i=1;i<=n;i++) cin>>d[i]>>s[i];
for(int i=1;i<=n;i++){
int len;
if(s[i] % 2 == 0){
len = s[i] / 2 - 1;
}else {
len = floor(1.0 * s[i] / 2);
}
ans = min(ans ,d[i] + len);
}
cout << ans << endl;
}
int main()
{
IOS
int _;
cin >> _;
// _ = 1;
while(_ --) solve();
return 0;
}
Problem - C - Codeforces
令i = a+b,枚举i,然后找到i的因子,就直接输出,遍历结束,找不到的话,表明没有符合题意得结果,输出-1即可;
c
#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
int gcd(int a,int b){ return b==0 ? a : gcd(b,a%b); }
int lcm(int a,int b){ if(a==0||b==0) return 0; return (a*b)/gcd(a,b); }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 205;
inline void solve(){
int l,r; cin>>l>>r;
for(int i=l;i<=r;i++){
for(int j=2;j<=sqrt(i);j++){
if(i%j==0){
cout << j<<" "<< i-j << endl;
return ;
}
}
}
cout << "-1" << endl;
return ;
}
int main()
{
IOS
int _;
cin >> _;
// _ = 1;
while(_ --) solve();
return 0;
}
https://codeforces.com/contest/1872/problem/D
这是一道构造数列的题,给出一个1-n的数组a的长度n,然后给出一个x,y;
按我的理解是,将数组中的数打乱顺序,使
的值最大;p1.x即a[x-1],p2.x即a[2*x-1],以此类推;
题目也就是求(下标+1)是x因子的数之和 - 是y因子的数之和的最大值;
理解好题意之后,最重要的就是去除px和py重复的部分;重复个数 : c : n / lcm(x,y);
lcm() : 最小公倍数;
那么x要取得个数 : a = n / x - c;
y要取得个数 ; b = n / y - c;
然后就是等差数列求和的思想分别按x取最大,y取最小求出答案;
具体请看代码 :
d
#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
int gcd(int a,int b){ return b==0 ? a : gcd(b,a%b); }
int lcm(int a,int b){ if(a==0||b==0) return 0; return (a*b)/gcd(a,b); }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
LL ans = 0;
inline void solve(){
LL n , x , y ; cin>>n>>x>>y;
LL z = x * y / gcd(x,y);
LL c = n / z;
LL a = n / x - c , b = n / y - c;
cout << a*(2*n-a+1)/2 - b*(1+b)/2 << endl;
}
int main()
{
IOS
int _;
cin >> _;
// _ = 1;
while(_ --) solve();
return 0;
}