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

首先规定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

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = ; int n, d, K[maxn];
long long f[maxn][maxn];
unsigned long long minv, maxv; //ull !!!
int zcnt = , ocnt = ;
int Z[maxn], O[maxn]; bool can_receive_zero(int i, int j) {
return i+ <= zcnt && (j == ocnt || O[j]+d >= Z[i]);
} bool can_receive_one(int i, int j) {
return j+ <= ocnt && (i == zcnt || Z[i]+d >= O[j]);
} void solve() {
// compute Z and O
ocnt = zcnt = ;
for(int i = ; i < n; i++)
if(K[i] == ) O[ocnt++] = i;
else Z[zcnt++] = i; minv = maxv = ;
int i = , j = ;
while(i < zcnt || j < ocnt) {
if(can_receive_zero(i, j)) //贪心策略0越前越好
{ i++; minv = minv * ; }
else
{ j++; minv = minv * + ; }
}
i = j = ;
while(i < zcnt || j < ocnt) {
if(can_receive_one(i, j)) { j++; maxv = maxv * + ; }
else { i++; maxv = maxv * ; }
} // dp
memset(f, , sizeof(f));
f[][] = ;
for(int i = ; i <= zcnt; i++)
for(int j = ; j <= ocnt; j++) {
if(can_receive_zero(i, j))
f[i+][j] += f[i][j];
if(can_receive_one(i, j))
f[i][j+] += f[i][j];
}
cout << f[zcnt][ocnt] << " " << minv << " " << maxv << "\n";
} int main() {
int kase = ;
unsigned long long k;
while(cin >> n >> d >> k) {
for(int i = ; i < n; i++) {
K[n-i-] = k % ; k /= ;
}
cout << "Case " << ++kase << ": ";
solve();
}
return ;
}

最新文章

  1. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
  2. AngularJS之开发组件的一些思路
  3. Git基础知识与常用命令
  4. python学习笔记整理——列表
  5. 为什么静态成员、静态方法中不能用this和super关键字
  6. 解析Java中静态变量与实例变量的区别
  7. [转]C++常见内存错误汇总
  8. 【转】使用junit4进行单元测试(高级篇)
  9. 编译安装nginx并修改版本头信息—参考实例
  10. Codeforces Round #197 (Div. 2) : D
  11. [置顶] 我的Android进阶之旅------&gt;介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam
  12. PHP学习笔记二十二【静态方法二】
  13. zk set 方法
  14. 从字节码看java中 this 的隐式传参
  15. Debian Security Advisory(Debian安全报告) DSA-4405-1 openjpeg2
  16. 使用Socket通信--测试叫号
  17. 4518: [Sdoi2016]征途
  18. linux-top命令查看内存CPU
  19. linux 负载均衡配置 keepalive lvs 使用nginx转发 CentOS7 搭建LVS+keepalived负载均衡
  20. 详细介绍Java中的堆和栈

热门文章

  1. Watir: 当出现错误提示AutoItX3.dll 没有注册的时候,该怎么处理?
  2. Spring Data JPA 和MyBatis比较
  3. 你真的会使用assert吗?
  4. Java递归应用:输出树形菜单
  5. 分区时&quot;磁盘上没有足够的空间完成此操作&quot;的解决方法
  6. kali的更新源
  7. HDU 5884 Sort (二分+k叉哈夫曼树)
  8. Android中shape的使用 (转载)
  9. 博客图片失效?使用npm工具一次下载/替换所有失效的外链图片
  10. React 从入门到进阶之路(九)