提供一些奇奇怪怪的解法供参考
2025-11-07 17:05:54
发布于:北京
4阅读
0回复
0点赞
普通数学解
#include <iostream>
using namespace std;
int n, m, a, b;
int main () {
cin >> n >> m;
cin >> a >> b;
cout << (n + m) / (a + b) << endl;
return 0;
}
但肯定不应是正解
暴力枚举法
枚举方案1
#include <iostream>
using namespace std;
#define int long long
int n, m, a, b;
signed main () {
cin >> n >> m;
cin >> a >> b;
int ans = 0, leva = n / a;
for (int i = 0; i <= leva; i ++) {
int lev_n = n - i * a;
int lev_m = m - i * b;
if (lev_m < 0) break;
int pik_j = min(lev_n / b, lev_m / a);
ans = max(ans, pik_j + i);
}
cout << ans << endl;
return 0;
}
并未考虑 n 极大,a 极小数据,超时应是必然
暴力简单优化
优化特判 a == b 的情况,并且显然是单峰情况,一旦下降,则有解。同样存在极限超时情况
#include <iostream>
using namespace std;
int n, m, a, b;
int main () {
cin >> n >> m;
cin >> a >> b;
if (a == b) {
cout << min(n / a, m / b) << endl;
return 0;
}
int ans = 0, leva = n / a;
for (int i = 0; i <= leva; i ++) {
int lev_n = n - i * a;
int lev_m = m - i * b;
if (lev_m < 0) break;
int pik_j = min(lev_n / b, lev_m / a);
if (pik_j + i >= ans) {
ans = pik_j + i;
} else break;
}
cout << ans << endl;
return 0;
}
暴力"玄学"优化
简单来说,在超时的极限赌一把,能过就不再优化了
#include <iostream>
using namespace std;
int n, m, a, b;
int main () {
cin >> n >> m;
cin >> a >> b;
if (a == b) {
cout << min(n / a, m / b) << endl;
return 0;
}
if (n > m) swap(n, m);
if (a > b) swap(a, b);
int ans = 0, leva = min(n / a, m / a);
for (int i = 0; i <= leva; i ++) {
if (i >= 5e7) {
ans = max((n + m) / (a + b), ans);
break;
}
int lev_n = n - i * a;
int lev_m = m - i * b;
if (lev_m < 0) break;
int pik_j = min(lev_n / b, lev_m / a);
if (pik_j + i >= ans) {
ans = pik_j + i;
} else break;
}
cout << ans << endl;
return 0;
}
很好,用数学法赌过了,不再优化
这里空空如也




有帮助,赞一个