CodeForces - 1498D Bananas in a Microwave(思维+dp)
题目链接:点击查看
题目大意:给出 nnn 次操作,初始时有一个 k=0k=0k=0,每次操作抽象为三个数 txyt\ x\ yt x y,其中 xxx 可能为小数,可以选择一个 num∈[0,y]num\in[0,y]num∈[0,y],使得:
- t=1t=1t=1:执行 numnumnum 次 k=⌈(k+x)⌉k=\lceil (k+x) \rceilk=⌈(k+x)⌉
- 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 了,分两种情况举例一下就明白了:
- 假设 u+t=vu+t=vu+t=v,那么 v+1v+1v+1 状态,可以从 u+t+1u+t+1u+t+1 更新,也可以从 v+1v+1v+1 更新
- 假设 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)相关推荐
- Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS
题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...
- codeforces1498 D. Bananas in a Microwave(背包+优化)
D. Bananas in a Microwave issue是fw题解 设计dp: 状态表示:fi,jf_{i,j}fi,j表示:前iii个操作是否能够凑成jjj. 状态转移:第iii次操作枚举操 ...
- 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 ...
- D. Bananas in a Microwave
D. Bananas in a Microwave 题意: u1s1,题意真难懂 有n个时间,每个时间给你两个操作,第一个是k=k+x,第二个是k=k∗x,且可以执行[0,y]次,(在第i个时间点,必 ...
- codeforces Round 21 808E. Selling Souvenirs 【dp好题】
codeforces Round 21 808E. Selling Souvenirs [dp好题] E. Selling Souvenirs time limit per test 2 second ...
- 枚举 ---- 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 ...
- Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp
Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...
- CodeForces - 1353E K-periodic Garland(思维+dp)
题目链接:点击查看 题目大意:给出 n 个灯泡以及其初始状态(开或关),每次操作可以将任意一个灯泡的状态置反,问最少需要操作多少次,可以使得所有开着的灯泡之间相距 k 个单位 题目分析:因为需要满足所 ...
- Codeforces Round #594 (Div. 2) C. Ivan the Fool and the Probability Theory 思维 + dp
文章目录 题意: 思路 题意: 思路 一开始找规律,表都打好了,没找出来.. 找规律还是适合让队友来. 先考虑第一行,我们先计算第一行的方案数,设f[i][j]f[i][j]f[i][j]表示到了ii ...
最新文章
- CUDA 内存统一分析
- oracle的39082,ORA-39082 导入数据遇到的问题
- Pipenv: Python包管理神器
- Centos6.5进入救援模式的方法
- Linux命令中的参数,linux中一些命令以及一些参数的用法
- python3.5以上版本的保留字总数是_python函数之参数(python3.5)
- pycharm连接mysql1193错误_pycharm连接mysql数据库提示错误的解决方法_数据库
- oj2894(贝尔曼福特模板)
- 运筹学动态规划逆序解法_运筹学第七章 动态规划讲解.ppt
- python 经典图书排行榜_书榜 | 计算机书籍(3.30-4.5)销售排行榜
- Vivado使用技巧(26):HDL编写技巧
- [转]MySQL整数数据的精确数字数据类型
- 三菱FX5U位逻辑指令
- Linux磁盘扩容的操作
- ENVI入门之不同影像镶嵌之后颜色不一样的色差问题
- Backdoor.Win32.Rbot病毒防治
- python对每一列进行归一化_对python3 一组数值的归一化处理方法详解
- java识别中文_Java 完美判断中文字符的方法
- MAX232后缀的含义
- 微信小程序-实现扫码自动连接wifi(android)
热门文章
- 南京大学与东南大学计算机学院,南京被“严重低估”的1所大学,拥有8个A+学科,无奈校名太普通...
- 数码显示实验报告C语言,数码问题C语言A星算法详细实验报告含代码(9页)-原创力文档...
- Redis操作key相关API
- Redis操作List类型
- MySQL8.0 版本的安装
- 关于MySQL 8.0
- MyBatis 实际使用案例-一级标签
- 基于Xml 的IOC 容器的初始化
- Redis高可用方案-公私混合云
- 代码演示:获取锁时被中断