一开始 \(k = 0\) ,然后你有两种操作:
注意:\(x_i\) 是一个浮点数
问:经过最少多少次操作,最后 \(k\) 会变成 \(j(1\leq j\leq m)\) ,输出步数最少的次数,如果不能,那么输出 -1
这个题目还是满巧妙的,很好的一个思维题。
最后感觉好像没有说的太明白,可以仔细看看 \(CF\) 的题解,非常好的一个题目,题解的代码也写的非常的漂亮。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const int base = 1e5;
typedef long long ll;
typedef pair<int,int>pii;
queue<pii>que;
struct node{
ll x;
int t,y;
}e[maxn];
int ans[maxn];
bool is_seen[maxn];
inline ll Ceil(ll x,ll y){
return (x + y - 1) / y;
}
auto cal(int t,ll &val,ll x) {
if (t == 1) val += Ceil(x,base);
else val = Ceil(val*x,base);
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d%lld%d", &e[i].t, &e[i].x, &e[i].y);
memset(ans, -1, sizeof(ans));
ans[0] = 0;
is_seen[0] = true;
que.push(pii(0, 0));
while (!que.empty()) {
auto k = que.front().first;
auto time = que.front().second;
que.pop(), time++;
if (time > n) break;
auto t = e[time].t;
auto x = e[time].x;
auto y = e[time].y;
ll val = k;
for (int i = 1; i <= y; i++) {
cal(t, val, x);
if (val > m) break;
if (is_seen[val]) break;
is_seen[val] = true;
ans[val] = time;
que.push(pii(val, time));
}
que.push(pii(k, time));
}
for (int i = 1; i <= m; i++) printf("%d ", ans[i]);
printf("\n");
}
D. Bananas in a Microwave dp + 思维
原文:https://www.cnblogs.com/EchoZQN/p/14606860.html