返回顶部

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;
    }
    
posted @ 2021-03-31 11:14  _Kolibri  阅读(46)  评论(0)    收藏  举报