题解 P6767 【[BalticOI 2020/2014 Day0] Roses】
看到这题让我想到了小学的学生外出乘车选车。
分析:
定义 \(x\) , \(y\) 分别是第一家和第二家店一朵玫瑰花的价格,
先只买每朵价格比较小的一家店,记录为 \(ans\) 。
再计算两家店每束花的最小公倍数确定枚举次数,
然后枚举更换每束花后的价格来跟 \(ans\) 进行比较。更新 \(ans\) 。
光说不行,得上代码:
#include "cstdio"
#include "algorithm"
#include "iostream"
long long n, a1, a2, b1, b2, ans, go;
int main() {
std::cin >> n >> a1 >> b1 >> a2 >> b2;
long double x = b1 * 1.0 / a1, y = b2 * 1.0 / a2;
if (x < y)
std::swap(a1, a2), std::swap(b1, b2);//为了方便之后的枚举
ans = (n + a2 - 1) / a2 * b2;
go = a2 / std::__gcd(a1, a2);
for (long long i = go; i >= 0; i--) {
long long t = i * b1;
if (n - i * a1 >= 0)
t = t + (n - i * a1 + a2 - 1) / a2 * b2;
ans = std::min(ans, t);
}
std::cout << ans;
return 0;
}
\(\small{Valentine 是人赢。}\)