题目链接:点击查看

题目大意:给出 nnn 次操作,初始时有一个 k=0k=0k=0,每次操作抽象为三个数 txyt\ x\ yt x y,其中 xxx 可能为小数,可以选择一个 num∈[0,y]num\in[0,y]num∈[0,y],使得:

  1. t=1t=1t=1:执行 numnumnum 次 k=⌈(k+x)⌉k=\lceil (k+x) \rceilk=⌈(k+x)⌉
  2. t=2t=2t=2:执行 numnumnum 次 k=⌈(k∗x)⌉k=\lceil (k*x) \rceilk=⌈(k∗x)⌉

问对于 [1,m][1,m][1,m] 的每个数,最少可以通过多少次操作获得,如果无法获得输出 −1-1−1

题目分析:读完题第一反应感觉是 bfsbfsbfs,但时间复杂度是 O(n∗m∗m)O(n*m*m)O(n∗m∗m) 级别的,因为一共有 n∗mn*mn∗m 个状态,每个状态又可以扩展出 mmm 次,所以显然是不可行的

看了题解后,发现这个模型也可以视为 010101 背包问题,其中,有 n∗mn*mn∗m 个物品,背包容量是 mmm,如果直接暴力的话复杂度显然也是 O(n∗m∗m)O(n*m*m)O(n∗m∗m) 的

不过对于本题而言,有一个很重要的性质,也就是如果某个容量 uuu 可以扩展到 vvv ,且 vvv 之前已经被更新过的话,那么就可以直接 breakbreakbreak 了,分两种情况举例一下就明白了:

  1. 假设 u+t=vu+t=vu+t=v,那么 v+1v+1v+1 状态,可以从 u+t+1u+t+1u+t+1 更新,也可以从 v+1v+1v+1 更新
  2. 假设 u∗t=vu*t=vu∗t=v,那么 v∗tv*tv∗t 状态,可以从 u∗t2u*t^2u∗t2 更新,也可以从 v∗tv*tv∗t 更新

所以综上所述,每个状态至多被更新一次,及时剪枝的话时间复杂度实际上是 O(n∗m)O(n*m)O(n∗m) 的

代码:

// Problem: D. Bananas in a Microwave
// Contest: Codeforces - CodeCraft-21 and Codeforces Round #711 (Div. 2)
// URL: https://codeforces.com/contest/1498/problem/D
// Memory Limit: 256 MB
// Time Limit: 3000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e5+100;
const int base=1e5;
bool dp[210][N];
LL t,x,y;
int ans[N];
void update(LL &cur) {if(t==1) {cur=cur+(x+base-1)/base;} else {cur=(cur*x+base-1)/base;}
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;memset(ans,-1,sizeof(ans));read(n),read(m);dp[0][0]=true;for(int i=1;i<=n;i++) {read(t),read(x),read(y);for(int j=0;j<=m;j++) {dp[i][j]=dp[i-1][j];}for(int j=0;j<=m;j++) {if(!dp[i-1][j]) {continue;}LL pos=j;for(int t=1;t<=y;t++) {update(pos);if(pos>m||dp[i-1][pos]) {break;}dp[i][pos]=true;ans[pos]=i;}}}for(int i=1;i<=m;i++) {printf("%d ",ans[i]);}return 0;
}

CodeForces - 1498D Bananas in a Microwave(思维+dp)相关推荐

  1. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

  2. codeforces1498 D. Bananas in a Microwave(背包+优化)

    D. Bananas in a Microwave issue是fw题解 设计dp: 状态表示:fi,jf_{i,j}fi,j​表示:前iii个操作是否能够凑成jjj. 状态转移:第iii次操作枚举操 ...

  3. codeforces #274 C. Riding in a Lift dp+前缀和优化

    codeforces #274  C. Riding in a Lift   dp+前缀和优化 Imagine that you are in a building that has exactly  ...

  4. D. Bananas in a Microwave

    D. Bananas in a Microwave 题意: u1s1,题意真难懂 有n个时间,每个时间给你两个操作,第一个是k=k+x,第二个是k=k∗x,且可以执行[0,y]次,(在第i个时间点,必 ...

  5. codeforces Round 21 808E. Selling Souvenirs 【dp好题】

    codeforces Round 21 808E. Selling Souvenirs [dp好题] E. Selling Souvenirs time limit per test 2 second ...

  6. 枚举 ---- Codeforces Round #711 (Div. 2) D. Bananas in a Microwave[枚举暴力+思维优化]

    题目链接 题目大意: 就是你有n次操作,每次操作给你三个参数:ti,xi,yit_i,x_i,y_iti​,xi​,yi​. 如果ti==1t_i == 1ti​==1你可以进行k=k+xik=k+x ...

  7. Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp

    Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...

  8. CodeForces - 1353E K-periodic Garland(思维+dp)

    题目链接:点击查看 题目大意:给出 n 个灯泡以及其初始状态(开或关),每次操作可以将任意一个灯泡的状态置反,问最少需要操作多少次,可以使得所有开着的灯泡之间相距 k 个单位 题目分析:因为需要满足所 ...

  9. Codeforces Round #594 (Div. 2) C. Ivan the Fool and the Probability Theory 思维 + dp

    文章目录 题意: 思路 题意: 思路 一开始找规律,表都打好了,没找出来.. 找规律还是适合让队友来. 先考虑第一行,我们先计算第一行的方案数,设f[i][j]f[i][j]f[i][j]表示到了ii ...

最新文章

  1. CUDA 内存统一分析
  2. oracle的39082,ORA-39082 导入数据遇到的问题
  3. Pipenv: Python包管理神器
  4. Centos6.5进入救援模式的方法
  5. Linux命令中的参数,linux中一些命令以及一些参数的用法
  6. python3.5以上版本的保留字总数是_python函数之参数(python3.5)
  7. pycharm连接mysql1193错误_pycharm连接mysql数据库提示错误的解决方法_数据库
  8. oj2894(贝尔曼福特模板)
  9. 运筹学动态规划逆序解法_运筹学第七章 动态规划讲解.ppt
  10. python 经典图书排行榜_书榜 | 计算机书籍(3.30-4.5)销售排行榜
  11. Vivado使用技巧(26):HDL编写技巧
  12. [转]MySQL整数数据的精确数字数据类型
  13. 三菱FX5U位逻辑指令
  14. Linux磁盘扩容的操作
  15. ENVI入门之不同影像镶嵌之后颜色不一样的色差问题
  16. Backdoor.Win32.Rbot病毒防治
  17. python对每一列进行归一化_对python3 一组数值的归一化处理方法详解
  18. java识别中文_Java 完美判断中文字符的方法
  19. MAX232后缀的含义
  20. 微信小程序-实现扫码自动连接wifi(android)

热门文章

  1. 南京大学与东南大学计算机学院,南京被“严重低估”的1所大学,拥有8个A+学科,无奈校名太普通...
  2. 数码显示实验报告C语言,数码问题C语言A星算法详细实验报告含代码(9页)-原创力文档...
  3. Redis操作key相关API
  4. Redis操作List类型
  5. MySQL8.0 版本的安装
  6. 关于MySQL 8.0
  7. MyBatis 实际使用案例-一级标签
  8. 基于Xml 的IOC 容器的初始化
  9. Redis高可用方案-公私混合云
  10. 代码演示:获取锁时被中断