CSPOJ:1561: 【提高】买木头
样例输入:
10 10000 8 20
样例输出:
201
代码:
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {int n, m, l, s;cin >> n >> m >> l >> s;vector<pair<int, int>> v;v.push_back({l, s});for (int i = 1; i < n; ++i) {int a = v[i-1].first, b = v[i-1].second;int c = (a * 37011 + 10193) % 10000 + 1;int d = (b * 73011 + 24793) % 100 + 1;v.push_back({c, d});}int L = 1, R = 0;for (auto &p : v) R = max(R, p.first);int ans = 0;while (L <= R) {int M = (L + R) / 2;long long t = 0;for (auto &p : v) {t += (long long)(p.first / M) * p.second;if (t >= m) break;}if (t >= m) {ans = M;L = M + 1;} else {R = M - 1;}}cout << ans << endl;return 0;
}
流程图:
┌───开始───┐│
┌─────▼─────┐
│ 输入n,m,l,s │
└─────┬─────┘│
┌─────▼─────┐
│ v初始化:加(l,s) │
└─────┬─────┘│
┌─────▼─────┐
│ 循环生成v剩余元素 │
│(i=1到n-1) │
└─────┬─────┘│
┌─────▼─────┐
│ 设L=1,R=v中最大first值 │
└─────┬─────┘│
┌─────▼─────┐ ┌───────────┐
│ L <= R? ├─是────┤ M=(L+R)/2 │
└─────┬─────┘ └─────┬─────┘│ ││ ┌───────▼───────┐│ │ 计算t=Σ(p.first/M * p.second) ││ └───────┬───────┘│ ││ ┌───────┴───────┐│ │ t >= m? ││ └───┬─────┬─────┘│ │ │
┌─────┴─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ 结束循环 │ │ ans=M │ │ R=M-1 │
│ 输出ans │ │ L=M+1 │ │ │
└───────────┘ └───────────┘ └───────────┘
制作不易点个赞吧
谢谢!