Codeforces Round 895 (Div. 3)

比赛地址 : 

Codeforces Round 895 (Div. 3)

A. Two Vessels

题目链接 : 

Problem - A - Codeforces

题面 : 

Codeforces Round 895 (Div. 3)_第1张图片

 题意 : 

你有两个装水的容器。第一个容器装有 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;
}

B. The Corridor or There and Back Again

题目链接 : 

Problem - B - Codeforces

题面 : 

Codeforces Round 895 (Div. 3)_第2张图片

题意 : 

Codeforces Round 895 (Div. 3)_第3张图片

思路 : 

枚举每一个陷阱,循环更新答案为(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;
}
 

C. Non-coprime Split

题目链接 : 

Problem - C - Codeforces

题面 : 

Codeforces Round 895 (Div. 3)_第4张图片

思路 : 

令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;
}

D. Plus Minus Permutation

题目链接 : 

https://codeforces.com/contest/1872/problem/D

题面  : 

Codeforces Round 895 (Div. 3)_第5张图片

题意: 

这是一道构造数列的题,给出一个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;
}

你可能感兴趣的:(算法学习,CF,算法,c++)