- 第5次随机赛(Div4)
题解
- 2023-5-26 11:15:50 @
A. 最小公倍数
为最小公倍数, 为最大公约数。
所以这题根据上式做就可以了,记得开,这题 可能会爆,所以上述式子可以变为
参考代码:
#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. 绩点
得分率数组都开 ,判断是否相等时记得考虑误差(因为是浮点数),此处误差范围取
参考代码:
#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依次考虑,能取则取 ,这样就能取到最少。记得开 。
参考代码:
#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 为一个循环节(循环节长度为 ),本题的样例解释:10 / 3 * 2 + 10 % 3 = 7。还是记得开 。
参考代码:
#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 条评论
目前还没有评论...