A. 最小公倍数

lcm(a,b)=ab /gcd(a,b)lcm(a, b) = a * b \ / gcd(a, b)

lcmlcm 为最小公倍数,gcdgcd 为最大公约数。

所以这题根据上式做就可以了,记得开long longlong \ long,这题 aba * b 可能会爆long longlong \ long,所以上述式子可以变为lcm(a,b)=a /gcd(a,b)blcm(a, b) = a \ / gcd(a, b) * b

参考代码:

#include<bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 1010;

LL gcd(LL a, LL b)
{
	return b ? gcd(b, a % b) : a;
}
int main()
{
	LL a, b;
	cin >> a >> b;

	LL ans = a / gcd(a, b) * b;
	cout << ans << "\n";
	return 0;
}

B. 绩点

得分率数组都开 doubledouble,判断是否相等时记得考虑误差(因为是浮点数),此处误差范围取 1e61e^{-6}

参考代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
double b[N], c[N];
int a[N];

int main()
{
	int n;
	cin >> n;

	for(int i = 1; i <= n; ++i)	cin >> a[i];
	for(int i = 1; i <= n; ++i){
		cin >> b[i];
		b[i] /= 100;
	}	
	for(int i = 1; i <= n; ++i){
		cin >> c[i];
		c[i] /= 100;
	}	

	double ans1 = 0, ans2 = 0;
	for(int i = 1; i <= n; ++i){
		ans1 += a[i] * b[i];
		ans2 += a[i] * c[i];
	}

	if(ans1 > ans2)	puts("ke");
	else if(abs(ans1 - ans2) < 1e-6)	puts("same");
	else	puts("do");
	return 0;
}

C. 贴邮票

从20、10、5、1依次考虑,能取则取 (n/v[id] != 0)(n / v[id] \ != \ 0),这样就能取到最少。记得开 long longlong \ long

参考代码:

#include<bits/stdc++.h>
using namespace std;
using LL = long long;
int v[] = {20, 10, 5, 1};
int main()
{
	LL n, ans = 0, id = 0;
	cin >> n;

	while(n != 0){//从大到小枚举邮票面值
		ans += n / v[id];
		n %= v[id];//还剩下多少面值
		++id;
	}

	cout << ans << "\n";
	return 0;
}

D. 红绿灯

直接枚举会TLE,所以这里考虑循环节的做法,题目给的样例是以 3s 为一个循环节(循环节长度为 a+ba + b),本题的样例解释:10 / 3 * 2 + 10 % 3 = 7。还是记得开 long longlong \ long

参考代码:

#include<bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 1010;
int main()
{
	LL a, b, c;
	cin >> a >> b >> c;

	LL ans = (c / (a + b)) * a;//绿灯能亮多少秒
	c %= (a + b);//计算最后一个循环节还剩多少秒

	if(c >= a)	ans += a;//一个循环节中绿灯能亮完
	else ans += c;
        
    //上述if-else可以写成ans += min(a, c);
	cout << ans << "\n";
	return 0;
}

0 条评论

目前还没有评论...