CodeCraft-21 and Codeforces Round #711 (Div. 2) D. Bananas in a Microwave 优化暴力
传送门
文章目录
- 题意:
- 思路:
题意:
有nnn个时间,每个时间给你两个操作,第一个是k=k+xk=k+xk=k+x,第二个是k=k∗xk=k*xk=k∗x,且可以执行[0,y][0,y][0,y]次,kkk初始状态为000,求[1,m][1,m][1,m]中kkk能到达的数的最短时间。
思路:
首先比较容易的能想到一个nm2nm^2nm2的暴力方法,就是遍历[1,n][1,n][1,n],让后对于每个已经出现过的数,尝试进行[0,y][0,y][0,y]次相应的操作,yyy的范围[0,m][0,m][0,m]。
我们可以发现这样更新的话,会有很多重复更新的数。
比如原本能到的数有[3,11][3,11][3,11],现在x=4,y=4x=4,y=4x=4,y=4,那么你对于每个数更新的时候遍历到的集合就是[3,7,11,15,19][3,7,11,15,19][3,7,11,15,19]和[11,15,19,23,27][11,15,19,23,27][11,15,19,23,27],我们可以发现当333加到111111后,之后的数都会在111111的位置再次加一遍,由此可见,我们当加数的时候,如果当前数已经存在了,那么我们直接breakbreakbreak就好啦,因为之后遍历到这个数的时候也会再次加一遍,这样是无效的工作。
由于我们[0,m][0,m][0,m]的数最多遍历两次,是常数级别的,所以复杂度为O(NM)O(NM)O(NM)。
还有就是上取整的时候最好别用浮点数的ceilceilceil,容易错。
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
struct Node
{LL t,x,y;
}a[N];
vector<bool>v(N+1,0);
int ans[N];int main()
{// ios::sync_with_stdio(false);
// cin.tie(0);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%lld%lld%lld",&a[i].t,&a[i].x,&a[i].y);if(a[i].t==1){LL now=(a[i].x+100000-1)/100000;a[i].x=now;}}v[0]=1;for(int i=1;i<=n;i++){auto nv=v;if(a[i].t==1){for(int k=0;k<=m;k++){if(!v[k]) continue;for(int j=1;j<=a[i].y;j++){LL now=1ll*j*a[i].x;if(now>m) break;if(now+k<=m&&!v[now+k]) nv[now+k]=true,ans[now+k]=i;else break;}}}else if(a[i].t==2){for(int k=0;k<=m;k++){if(!v[k]) continue;LL now=k;for(int j=1;j<=a[i].y;j++){now=(now*a[i].x+100000-1)/100000;if(now>m) break;if(now<=m&&!v[now]) nv[now]=true,ans[now]=i;else break;}}}v=nv;}for(int i=1;i<=m;i++) if(ans[i]==0) printf("-1 "); else printf("%d ",ans[i]);return 0;
}
CodeCraft-21 and Codeforces Round #711 (Div. 2) D. Bananas in a Microwave 优化暴力相关推荐
- 枚举 ---- 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 ...
- 【Christmas Game】【CodeCraft-21 and Codeforces Round #711 (Div. 2)】【Nim-博弈】【树形DP】【拆分树】
CodeCraft-21 and Codeforces Round #711 (Div. 2) Christmas Game Nim-博弈 树形DP 拆分树 牛客链接 https://ac.nowco ...
- CodeCraft-21 and Codeforces Round #711 (Div. 2) 题解
先上链接CodeCraft-21 and Codeforces Round #711 (Div. 2) A: 从n开始往后找,不出几十个 一定能找到的,所以暴力就好了 void sovle(){cin ...
- CodeCraft-21 and Codeforces Round #711 (Div. 2)
CodeCraft-21 and Codeforces Round #711 (Div. 2) 题号 题目 考点 A GCD Sum 签到,模拟 B Box Fitting 贪心 C Planar R ...
- 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]
题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...
- CodeCraft-21 and Codeforces Round #711 (Div. 2)ABC题解
A题,至少能找到个gcd=2gcd=2gcd=2的,只要222个都是偶数就行 #include<bits/stdc++.h> using namespace std; typedef lo ...
- CodeCraft-21 and Codeforces Round #711 (Div. 2) C. Planar Reflections
题意 给定一个衰变期为k的粒子,依次穿过n个墙(从左到右),每次穿过一个墙,都会在运动的反方向生成一个衰变期为k -1 的粒子,这个粒子仍保持原来的衰变期和方向穿下一个墙,生成的粒子沿反方向穿墙.直到 ...
- CodeCraft-21 and Codeforces Round #711 (Div. 2) B. Box Fitting(优先队列)
传送门 题意: 给一堆高度为1的小块,长度为2的次幂,给一个长度为W(W肯定大于小块的最大长度)的框,要求把所有小块放进框内,求出最小高度,保证小块不旋转也不重叠: 思路: 用优先队列(默认是大根堆) ...
- 2021-03-30 CodeCraft-21 and Codeforces Round #711 (Div. 2)
这场比赛,只A了一道,暴露了我很多不足的地方. A. GCD Sum 题意:就是判断一个数和他所有位上的数加起来的值的gcd是否大于一,等于一就对当前数加1,直到两者的gcd大于一. #include ...
最新文章
- 如何查看一个jar文件是用什么版本jdk编译的?
- 智能工厂的关键:基于机器学习的工业视觉
- ES6中表达export default const是无效的
- 一台台式计算机的主要配件有哪些,电脑的基本配件有哪些
- VNC over reverse SSH
- 串口不通或乱码,排查方法
- 一台机器起多个filebeat_全自动多色丝印机一台多少钱?
- rpc协议微服务器,RPC协议及实现方式(分布式微服务治理的核心)
- Win10 64位安装SQL2000(个人版)
- python情感分析预测模型_Python 使用 NLTK 实现简单情感分析--Twitter(推特)分析...
- 局域网访问提示无法访问检查拼写_关于海康视频监控异地访问设置一些细节的说明...
- 232 Crossword Answers
- 使用REST framework
- java中的VO、PO、BO、DAO、POJO
- Debian9开机:firmware: failed to load rtl_nic/rtl8168g-3.fw (-2)
- 中继器的使用方法(终)
- fedora15 一些简单应用
- 跟着Nature学作图:最强“ 颠覆性 ”技术,您确定不学学?助力发Nature顶刊!...
- Tesseract 教程
- visual studio安装进度条为零,检查网络链接;aka.ms拒绝连接,因为使用的HSTS...;无法访问github.com;外网无法访问
热门文章
- 软件配置管理(三)软件配置管理核心功能
- 为什么要在沙河中设置小堤坝?
- 那些不回微信的人,都在看什么?
- 程序员面试必备的20条Python经典面试题
- 在c语言中,字符串topt65的长度是,谭浩强c__程序设计第13章.ppt
- detectron2训练自己的数据集_keras版MaskRCNN来训练自己的目标检测数据集
- 计算机竞赛游戏探险岛,冒险岛2五大全新团本综合分析
- java file_java开发之File类详细使用方法介绍
- adf盖怎么打开_罐头好吃盖难开,学会这几招,再不靠蛮力了,女生也轻松拧开...
- java awt区域_java的awt包中有没有表示区域的类或者方法,可以传递一个Rectangle