CDN流量调度问题

题看了没多久就看出来是\(DP\)的题,然后就设了状态\(f[i][j]\)表示到前\(i\)个点时已经用了\(j\)个节点的最小总代价,结果发现转移时\(O(nm^2)\),但这样只会T掉的,于是就顺利应当的进入了DP优化的思维,奈何无论用上什么伎俩都好像有点不太奏效,以下给出暴力的代码:

  1. rep(i,1,n) rep(j,0,m)
  2. rep(k,1,min(j+1,t[i]))//枚举i的节点数量。
  3. f[i][j]=min(f[i][j],f[i-1][j+1-k]+a[i]/k+(a[i]%k?1:0));

发现难点就在于转移时,\(a[i]/k\)(向上取整)这个没法很好的处理....之后看来看题解,发现果然是在这里做文章的,这里考虑我们暴力的做法k的范围从1到min(j+1,t[i]),相当于将所有可能的都枚举了。但再仔细的瞅一眼上面这个式子,\(a[i]/k=t\)(这里向上取整)。也就是说\(a[i]=k*t\)那\(k\)和\(t\)不就是\(a[i]\)的因子吗?不不不...这里由于是向上取整的缘故,所以不是严格意义下的因子,因为我们可以发现对于任意一个数,它都能除以其他数在向下取整的情况下。那我们怎么办呢?考虑到是向上取整的缘故,所以一定有\(k*t>=a[i]\),并且要求\(k\)和\(a[i]\)一定时,\(t\)最小,这样的话,我们也可以通过枚举所谓“因子”的方法枚举\(k\),若因为k和t是成对存在的我们枚举小的那个,这样的话,我们枚举的范围就是\(\sqrt{a[i]}\)。

怎么说呢,这个题反正到最后还是有点不很理解的...

为什么这个k得枚举范围就降了一个\(\sqrt{a[i]}\),大概可以这么说吧,就是你通过分析这个\(a[i]/k\)向上取整这个得值最多是2*\(\sqrt{a[i]}\),所以有很多的k,\(a[i]/k\)向上取整对应的值都一样的,这样的情况下,你就根本没必要去枚举那些多余的k值,你只需要知道\(a[i]/k\)有多少个值,并且他们所对应的最小的k就行了,大的k但和他们贡献相同的就不用枚举了....通过预处理,可以提前缩短我们遍历的状态空间,可以说这个题给我带来的启示很大!

  1. //不等,不问,不犹豫,不回头.
  2. #include<bits/stdc++.h>
  3. #define _ 0
  4. #define ls p<<1
  5. #define db double
  6. #define rs p<<1|1
  7. #define P 1000000007
  8. #define RE register
  9. #define ll long long
  10. #define INF 1000000000
  11. #define get(x) x=read()
  12. #define PLI pair<ll,int>
  13. #define PII pair<int,int>
  14. #define ull unsigned long long
  15. #define put(x) printf("%d\n",x)
  16. #define putl(x) printf("%lld\n",x)
  17. #define rep(x,y,z) for(int x=y;x<=z;++x)
  18. #define fep(x,y,z) for(int x=y;x>=z;--x)
  19. #define go(x) for(RE int i=link[x],y=a[i].y;i;y=a[i=a[i].next].y)
  20. using namespace std;
  21. const int N=105,M=10050;
  22. int T,n,m,a[N],t[N],f[N][M],size[N];//f[i][j]表示前i个线路用了j的节点的最小代价。
  23. PII v[N][M];//预处理出每个线路的所有不同的向上取整的结果已及所需的节点数。
  24. inline int read()
  25. {
  26. int x=0,ff=1;
  27. char ch=getchar();
  28. while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
  29. while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  30. return x*ff;
  31. }
  32. int main()
  33. {
  34. //freopen("1.in","r",stdin);
  35. get(T);
  36. while(T--)
  37. {
  38. get(n);get(m);
  39. rep(i,1,n) get(a[i]);
  40. rep(i,1,n) get(t[i]);
  41. memset(f,0x3f,sizeof(f));
  42. memset(size,0,sizeof(size));
  43. f[0][0]=0;
  44. rep(i,1,n)
  45. {
  46. int temp=0;
  47. rep(j,1,t[i])
  48. {
  49. if(a[i]/j+(a[i]%j?1:0)!=temp)
  50. {
  51. temp=a[i]/j+(a[i]%j?1:0);
  52. v[i][++size[i]]={temp,j};
  53. }
  54. }
  55. }
  56. rep(i,1,n) rep(j,0,m)
  57. {
  58. if(j) f[i][j]=min(f[i][j],f[i][j-1]);
  59. rep(l,1,size[i])
  60. {
  61. if(v[i][l].second-1>j) break;
  62. f[i][j]=min(f[i][j],f[i-1][j+1-v[i][l].second]+v[i][l].first);
  63. }
  64. }
  65. put(f[n][m]);
  66. }
  67. return (0^_^0);
  68. }
  69. //以吾之血,铸吾最后的亡魂.

2021CCPC华为云挑战赛 部分题题解的更多相关文章

  1. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  2. MySQL数据库开发的36条原则【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  3. Python面试的一些心得,与Python练习题分享【华为云技术分享】

    版权声明:本文为CSDN博主「华为云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/devcloud/arti ...

  4. 华为云ModelArts 2.0全面升级,革新传统AI开发模式

    [中国,上海,9月20日] 在HUAWEI CONNECT 2019期间,华为云EI服务产品部总经理贾永利宣布--华为云AI重装升级,并重磅发布一站式AI开发管理平台ModelArts 2.0. 现场 ...

  5. 沈抚示范区·“华为云杯”2021全国AI大赛圆满落

    摘要:以赛促学,赛教结合!驱动AI产业繁荣发展 本文分享自华为云社区<云聚沈抚 · 智赢未来!沈抚示范区·"华为云杯"2021全国AI大赛圆满落幕>,作者:灰灰哒. 近 ...

  6. 如何在华为云软件开发云上搭建JavaWeb,Maven项目

    本文将使用华为云软件开发云向大家演示如何搭建JavaWeb,Maven项目. 一.相关信息 1.华为云软件开发云简介 华为云软件开发云(DevCloud)是集华为近30年研发实践,前沿研发理念,先进研 ...

  7. 华为云照片的爬虫程序更新(python3.6)

    一.背景: 每年终都有一个习惯,就是整理资料进行归档,结果发现手机照片全备份在华为云里,在官网上找了一圈,没找到官方的pc工具用来同步照片. 于是找出上次写的程序,看看能不能爬到数据,然而……果然不好 ...

  8. 华为云(ECS)-linux服务器中-Ubuntu图形界面安装-解决root登录受限-VNCviwer/Teamviwer远程访问教程

    安装ubuntu-desktop .更新软件库 apt-get update .升级软件 apt-get upgrade .安装桌面 apt-get install ubuntu-desktop 解决 ...

  9. 华为云.NET Core支持情况调查

    各大公有云都提供了开发者开发的SDK,今天我们来看看华为云对.NET Core的支持情况怎么样? .NET SDK地址 https://developer.huaweicloud.com/sdk#.N ...

随机推荐

  1. vue-cli3 创建多页面应用项目

    1.创建vue项目 cmd命令执行  vue create ruc-continuing  创建vue项目,项目名称:ruc-continuing 选择一个 preset(预置项),或自定义: 选择自 ...

  2. CodeForce-810B Summer sell-off (结构体排序)

    http://codeforces.com/problemset/problem/810/B 已知n天里,已知第i天的供货量和需求量,给定一个f,可以在n天之中选f天促销使得供货量翻倍. 问选择其中f ...

  3. css3 animate转圈360旋转

    .logo{ width:20px; height: 20px; background: red; -webkit-animation:haha1 .8s linear infinite; anima ...

  4. Java基础(六)——集合

    一.概述 1.介绍 为什么出现集合? 答:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合类同是容器,有何不同? ...

  5. Docker DevOps实战:Docker+Jenkins+Python+Pytest+Allure(2)- Jenkins初始化、Jenkins插件、Jenkins配置、自动化测试

    Jenkins初始化 step-1 访问Jenkins http://ip:80  step-2 查看密码.输入密码 # 方式一:通过查看容器日志 [root@localhost ~]# docker ...

  6. Django边学边记--状态保持(cookie和session)

    Cookie 概念: Cookie,也叫Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密),好比会员卡或餐票. 特点: Cookie是由服务 ...

  7. ES增删改查

    了解了一下python对es 7.5的操作,记录下,不难: #!/usr/bin/env python # -*- coding: UTF-8 -*- from settings import Con ...

  8. hadoop生态之CDH搭建系列

    本次搭建使用的版本是CloudManager 1.15.1

  9. P5494-[模板]线段树分裂

    正题 题目链接:https://www.luogu.com.cn/problem/P5494 题目大意 给出一个可重集合要求支持 将集合\(p\)中在\([l,r]\)的数放到一个新的集合中 将集合\ ...

  10. Python setattr() 函数 ,Python super() 函数: Python 内置函数 Python 内置函数

    描述 setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在. 语法 setattr 语法: setattr(object, name, value) 参数 object -- ...