CodeCraft-21 and Codeforces Round #711 (Div. 2) D. Bananas in a Microwave (暴力枚举)

-
题意:枚举\([1,m]\),给你\(n\)个数据,每次数据有三个数\(t,x,y\),如果\(t=1\),那么最多可以操作\(y\)次,每次看可以对当前的数+=x,如果\(t=2\)就是每次*=x,问你最少遍历到第几组数据可以得到\(i\),如果得不到就输出\(-1\).
-
题解:我们可以直接遍历\(n\)组数据,每次反着枚举\(m\),然后每组数据跑\(y\)次直接把所有能得到的数给筛出来,因为遍历\([1,n]\)的,所以每次得到的答案一定是最优的.
-
代码:
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pb push_back #define me memset #define rep(a,b,c) for(int a=b;a<=c;++a) #define per(a,b,c) for(int a=b;a>=c;--a) const int N = 1e6 + 10; const int mod = 1e9 + 7; const int INF = 0x3f3f3f3f; using namespace std; typedef pair<int,int> PII; typedef pair<ll,ll> PLL; ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;} ll lcm(ll a,ll b) {return a/gcd(a,b)*b;} int ans[N]; int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int n,m; cin>>n>>m; me(ans,-1,sizeof(ans)); ans[0]=0; rep(i,1,n){ ll t,x,y; cin>>t>>x>>y; per(j,m,0){ if(ans[j]==-1) continue; ll cur=j; rep(k,1,y){ if(t==1){ cur+=(x-1)/100000+1; } else{ if(cur==0) break; //防止cur=0时上取整公式得到1 cur*=x; cur=(cur-1)/100000+1; } //此时得到的cur一定是比j大的,那么后面再得到的cur我们一定都算过了,所以可以直接break if(cur>m || ans[cur]>=1) break; ans[cur]=i; } } } rep(i,1,m) cout<<ans[i]<<' '; cout<<'\n'; return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号