CodeCraft-21 and Codeforces Round #711 (Div. 2) D. Bananas in a Microwave
Posted 吃花椒的妙酱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeCraft-21 and Codeforces Round #711 (Div. 2) D. Bananas in a Microwave相关的知识,希望对你有一定的参考价值。
题目大意:n个时间点,每个时间点有一个操作,现有两种操作,给定x,y,操作一是给数加上x并向上取整,可以加1到y次
操作二是乘x并向上取整,可以乘1到y次,现在问1~m每个数是否可以被构成,输出构成的时间点
思路:分组背包、模拟枚举
因为n不大,所以直接模拟每次操作能获得的状态
写法和分组背包差不多,每个时间点的操作相当于物品,y是物品数,x是物品体积
注意剪枝,共有三层循环,注意第二层循环总体积是从大到小循环的,所以如果第三层循环出现已知体积则可以break了(加法乘法操作都是如此,因为倍数关系后面状态肯定也是已知的了)
表面上是暴力枚举,实质是分组背包QAQ
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
using namespace std;
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define pb push_back
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define int long long
#define inf 0x3f3f3f3f
#define pii pair<int ,int >
#define fi first
#define se second
#define endl "\\n"
typedef long long ll;
const int N=1e6+10;
const int mod = 1e5;
int n,m;
int dp[N];
signed main()
{
// freopen("data.txt","r",stdin);
IOS;
mst(dp,-1);
dp[0]=0;
cin>>n>>m;
_for(i,1,n)
{
int t,x,y;cin>>t>>x>>y;
if( t==1 )
{
x = (x%mod==0 ? x/mod : x/mod+1 );
_rep(j,m,0)
{
if( dp[j] >= 0)
{
for(int k=1 ;k<=y && j+k*x<=m;k++)
{
if( dp[j+k*x] == -1 )
{
dp[j+k*x] = i;
}
else break;//剪枝
}
}
}
}
else
{
if( x==mod ) continue;
_rep(j,m,1)
{
if(dp[j]!=-1)
{
for(int k = j*x ,cnt=1; cnt<=y && k<=m*mod+1;cnt++,k = k*x)
{
k = (k%mod==0? k/mod : k/mod+1);
if( dp[k] == -1 ) dp[k] = i;
else break;
}
}
}
}
}
_for(i,1,m) cout<<dp[i]<<" ";
}
以上是关于CodeCraft-21 and Codeforces Round #711 (Div. 2) D. Bananas in a Microwave的主要内容,如果未能解决你的问题,请参考以下文章
CodeCraft-21 and Codeforces Round #711 (Div. 2) A,B,C题题解
CodeCraft-21 and Codeforces Round #711 (Div. 2)A-D题解
CodeCraft-21 and Codeforces Round #711 (Div. 2) D. Bananas in a Microwave
Codeforces - 1191E - Tokitsukaze and Duel - 博弈论