传送门

文章目录

  • 题意:
  • 思路:

题意:

有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 优化暴力相关推荐

  1. 枚举 ---- 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 ...

  2. 【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 ...

  3. CodeCraft-21 and Codeforces Round #711 (Div. 2) 题解

    先上链接CodeCraft-21 and Codeforces Round #711 (Div. 2) A: 从n开始往后找,不出几十个 一定能找到的,所以暴力就好了 void sovle(){cin ...

  4. 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 ...

  5. 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]

    题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...

  6. CodeCraft-21 and Codeforces Round #711 (Div. 2)ABC题解

    A题,至少能找到个gcd=2gcd=2gcd=2的,只要222个都是偶数就行 #include<bits/stdc++.h> using namespace std; typedef lo ...

  7. CodeCraft-21 and Codeforces Round #711 (Div. 2) C. Planar Reflections

    题意 给定一个衰变期为k的粒子,依次穿过n个墙(从左到右),每次穿过一个墙,都会在运动的反方向生成一个衰变期为k -1 的粒子,这个粒子仍保持原来的衰变期和方向穿下一个墙,生成的粒子沿反方向穿墙.直到 ...

  8. CodeCraft-21 and Codeforces Round #711 (Div. 2) B. Box Fitting(优先队列)

    传送门 题意: 给一堆高度为1的小块,长度为2的次幂,给一个长度为W(W肯定大于小块的最大长度)的框,要求把所有小块放进框内,求出最小高度,保证小块不旋转也不重叠: 思路: 用优先队列(默认是大根堆) ...

  9. 2021-03-30 CodeCraft-21 and Codeforces Round #711 (Div. 2)

    这场比赛,只A了一道,暴露了我很多不足的地方. A. GCD Sum 题意:就是判断一个数和他所有位上的数加起来的值的gcd是否大于一,等于一就对当前数加1,直到两者的gcd大于一. #include ...

最新文章

  1. 如何查看一个jar文件是用什么版本jdk编译的?
  2. 智能工厂的关键:基于机器学习的工业视觉
  3. ES6中表达export default const是无效的
  4. 一台台式计算机的主要配件有哪些,电脑的基本配件有哪些
  5. VNC over reverse SSH
  6. 串口不通或乱码,排查方法
  7. 一台机器起多个filebeat_全自动多色丝印机一台多少钱?
  8. rpc协议微服务器,RPC协议及实现方式(分布式微服务治理的核心)
  9. Win10 64位安装SQL2000(个人版)
  10. python情感分析预测模型_Python 使用 NLTK 实现简单情感分析--Twitter(推特)分析...
  11. 局域网访问提示无法访问检查拼写_关于海康视频监控异地访问设置一些细节的说明...
  12. 232 Crossword Answers
  13. 使用REST framework
  14. java中的VO、PO、BO、DAO、POJO
  15. Debian9开机:firmware: failed to load rtl_nic/rtl8168g-3.fw (-2)
  16. 中继器的使用方法(终)
  17. fedora15 一些简单应用
  18. 跟着Nature学作图:最强“ 颠覆性 ”技术,您确定不学学?助力发Nature顶刊!...
  19. Tesseract 教程
  20. visual studio安装进度条为零,检查网络链接;aka.ms拒绝连接,因为使用的HSTS...;无法访问github.com;外网无法访问

热门文章

  1. 软件配置管理(三)软件配置管理核心功能
  2. 为什么要在沙河中设置小堤坝?
  3. 那些不回微信的人,都在看什么?
  4. 程序员面试必备的20条Python经典面试题
  5. 在c语言中,字符串topt65的长度是,谭浩强c__程序设计第13章.ppt
  6. detectron2训练自己的数据集_keras版MaskRCNN来训练自己的目标检测数据集
  7. 计算机竞赛游戏探险岛,冒险岛2五大全新团本综合分析
  8. java file_java开发之File类详细使用方法介绍
  9. adf盖怎么打开_罐头好吃盖难开,学会这几招,再不靠蛮力了,女生也轻松拧开...
  10. java awt区域_java的awt包中有没有表示区域的类或者方法,可以传递一个Rectangle