这道题思维很灵活。也有点套路的意思。

首先规定0,1分别按照原来的顺序接收,只是01换位。这样简化了思维。(否则并不会有更优结果它。,比较好想)
最大值和最小值可以贪心得到。
那么接下来就是给定一个整数P,判断能不能得到它。
贪心法,从左到右判断P的每一位,从K中最左边的0或1取。
这样会发现任意时刻k中已经被接收的位最右边那那位一定没有延迟(想一想,也比较好想)
设d(i,j)表示用了k的前i个0,前k个1后形成的整数数
则下一个接收的bit是0,转移d(i+1,j)
1 则d(i,j+1)
判断下一个接受的能否为1或0
设第i个0发送时间为Zi,对应有Oi,那么Oj+d>=Zi才可以转移到i+1;j+1对应 画图证一下(用到上一个结论;比如i+1的情况,分接受的最后一位是0或1讨论;还要注意1用完了就不能这么判断了)
同时判断0,1有没有用完

这样就把十进制转化成二进制了
for(int i = 0; i < n; i++) {
K[n-i-1] = k % 2; k /= 2;
}

还要注意k,min,max要用ull

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. const int maxn = ;
  8.  
  9. int n, d, K[maxn];
  10. long long f[maxn][maxn];
  11. unsigned long long minv, maxv; //ull !!!
  12. int zcnt = , ocnt = ;
  13. int Z[maxn], O[maxn];
  14.  
  15. bool can_receive_zero(int i, int j) {
  16. return i+ <= zcnt && (j == ocnt || O[j]+d >= Z[i]);
  17. }
  18.  
  19. bool can_receive_one(int i, int j) {
  20. return j+ <= ocnt && (i == zcnt || Z[i]+d >= O[j]);
  21. }
  22.  
  23. void solve() {
  24. // compute Z and O
  25. ocnt = zcnt = ;
  26. for(int i = ; i < n; i++)
  27. if(K[i] == ) O[ocnt++] = i;
  28. else Z[zcnt++] = i;
  29.  
  30. minv = maxv = ;
  31. int i = , j = ;
  32. while(i < zcnt || j < ocnt) {
  33. if(can_receive_zero(i, j)) //贪心策略0越前越好
  34. { i++; minv = minv * ; }
  35. else
  36. { j++; minv = minv * + ; }
  37. }
  38. i = j = ;
  39. while(i < zcnt || j < ocnt) {
  40. if(can_receive_one(i, j)) { j++; maxv = maxv * + ; }
  41. else { i++; maxv = maxv * ; }
  42. }
  43.  
  44. // dp
  45. memset(f, , sizeof(f));
  46. f[][] = ;
  47. for(int i = ; i <= zcnt; i++)
  48. for(int j = ; j <= ocnt; j++) {
  49. if(can_receive_zero(i, j))
  50. f[i+][j] += f[i][j];
  51. if(can_receive_one(i, j))
  52. f[i][j+] += f[i][j];
  53. }
  54. cout << f[zcnt][ocnt] << " " << minv << " " << maxv << "\n";
  55. }
  56.  
  57. int main() {
  58. int kase = ;
  59. unsigned long long k;
  60. while(cin >> n >> d >> k) {
  61. for(int i = ; i < n; i++) {
  62. K[n-i-] = k % ; k /= ;
  63. }
  64. cout << "Case " << ++kase << ": ";
  65. solve();
  66. }
  67. return ;
  68. }

uva1228 Integer Transmission的更多相关文章

  1. UVALive 4031 Integer Transmission(贪心 + DP)

    分析:求出最大值和最小值比较简单,使用贪心法,求最小值的时候我们让所有的0尽可能的向后延迟就可以了,求最大值则相反. 关键在于求出可以组合出的数字个数. 这就是组合数学版的dp了,我们让dp[i][j ...

  2. light oj 1155 - Power Transmission【拆点网络流】

    1155 - Power Transmission   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  3. ACdream 1229 Data Transmission

    Data Transmission Special JudgeTime Limit: 12000/6000MS (Java/Others)Memory Limit: 128000/64000KB (J ...

  4. lightoj--1155-- Power Transmission (最大流拆点)

    Power Transmission Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Sub ...

  5. LeetCode 7. Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Have you ...

  6. Integer.parseInt 引发的血案

    Integer.parseInt 处理一个空字符串, 结果出错了, 程序没有注意到,搞了很久, 引发了血案啊!! 最后,终于 观察到了, 最后的部分: Caused by: java.lang.NoC ...

  7. MTU(Maximum transmission unit) 最大传输单元

    最大传输单元(Maximum transmission unit),以太网MTU为1500. 不同网络MTU如下: 如果最大报文数据大小(MSS)超过MTU,则会引起分片操作.   路径MTU: 网路 ...

  8. 由一个多线程共享Integer类变量问题引起的。。。

    最近看到一个多线程面试题,有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC- 看到这个题目,首先想到的是解决方法是定义一个Integer类对象,初始化为0,由3个线 ...

  9. [LeetCode] Integer Replacement 整数替换

    Given a positive integer n and you can do operations as follow: If n is even, replace n with n/2. If ...

随机推荐

  1. HTML中的align和valign这两个属性

    转自:https://www.douban.com/note/325833958/ align和valign属性均是规定表格相对于周围元素的对齐方式,区别就在于: 1.align属性趋向于左右对齐,其 ...

  2. 3.11-3.15 HDFS HA

    一.背景 1. Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF).对于只有一个NameNode的集群, 若NameNode机器出现故障,则整个集群将无法使用,直到Nam ...

  3. C++经典面试题库 附带参考答案

    1.    面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象. 2.    什么是类? 答:把一些具有共性的对象归类后形成一个集合,也就是所谓的类. 3.  ...

  4. 51nod 1596 搬货物(二进制处理)

    传送门 题意 分析 只要从小到大二进制处理即可 我一直遍历了1->n,应该是0->1e6+1000 果然智障 trick 代码 #include<cstdio> #includ ...

  5. JAVA多线程(四) Executor并发框架向RabbitMQ推送消息

    github代码地址: https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service ...

  6. 第二类Stirling数初探 By cellur925

    上午noi.ac崩崩崩了,栽在组合数学上,虽说最后在辰哥&Chemist的指导下A掉了此题,也发现自己组合数学太弱了qwq. 在luogu上找题,结果找到了一个第二类斯特林数的题(还是双倍经验 ...

  7. hql语法及自定义函数(含array、map讲解) + hive的java api

    本博文的主要内容如下: .hive的详细官方手册    .hive支持的数据类型   .Hive Shell .Hive工程所需依赖的jar包  .hive自定义函数 .分桶4   .附PPT hiv ...

  8. 51Nod 1094 和为k的连续区间

    #include <iostream> #include <algorithm> #include <cstring> using namespace std; t ...

  9. iOS WKWebView 退出后停止播放音频/视频

    带有<video>或者<audio>标签的H5网页在播放音频视频时,退出webview后不会自动停止播放,手动处理一下. 1.注入使网页停止音频.视频播放的JS代码(Swift ...

  10. web.xml中classpath*:与classpath:的区别

    classpath对应src目录,该目录下的文件会在编译后被存放到WEB-INF文件夹下的classes目录. classpath:只会到你的class路径中查找配置文件,对于多个同名的配置文件,只会 ...