uva1228 Integer Transmission
这道题思维很灵活。也有点套路的意思。
首先规定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 ;
}
uva1228 Integer Transmission的更多相关文章
- UVALive 4031 Integer Transmission(贪心 + DP)
分析:求出最大值和最小值比较简单,使用贪心法,求最小值的时候我们让所有的0尽可能的向后延迟就可以了,求最大值则相反. 关键在于求出可以组合出的数字个数. 这就是组合数学版的dp了,我们让dp[i][j ...
- light oj 1155 - Power Transmission【拆点网络流】
1155 - Power Transmission PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...
- ACdream 1229 Data Transmission
Data Transmission Special JudgeTime Limit: 12000/6000MS (Java/Others)Memory Limit: 128000/64000KB (J ...
- lightoj--1155-- Power Transmission (最大流拆点)
Power Transmission Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Sub ...
- LeetCode 7. Reverse Integer
Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Have you ...
- Integer.parseInt 引发的血案
Integer.parseInt 处理一个空字符串, 结果出错了, 程序没有注意到,搞了很久, 引发了血案啊!! 最后,终于 观察到了, 最后的部分: Caused by: java.lang.NoC ...
- MTU(Maximum transmission unit) 最大传输单元
最大传输单元(Maximum transmission unit),以太网MTU为1500. 不同网络MTU如下: 如果最大报文数据大小(MSS)超过MTU,则会引起分片操作. 路径MTU: 网路 ...
- 由一个多线程共享Integer类变量问题引起的。。。
最近看到一个多线程面试题,有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC- 看到这个题目,首先想到的是解决方法是定义一个Integer类对象,初始化为0,由3个线 ...
- [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 ...
随机推荐
- Linux终端那件事儿
我们将会讨论如何更好的控制用户终端:也就说是键盘输入与屏幕输出.除了这些,我们还会了解我们编写的程序如何由用户处读取输入,即使是在输入重定向的情况下,以及确保输出到屏幕的正确位置.这里所提供的一些底层 ...
- B. Vanya and Books
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- ORACLE PL/SQL 实例精解之第三章 PL/SQL中的SQL
3.1 在PL/SQL中使用DML 在PL/SQL语块中,两种变量赋值a. := 初始化.b. select into语法,PL/SQL语块的声明部分被声明的变量,后期可以使用选择语句进行赋值. 3. ...
- 位运算【C++学习(计蒜客)】
C++提供了位运算操作符,使程序可以直接对内存进行操作.C++的这个特色大大提高了C++程序的执行能力.例如使用位操作运算可以将一个存储单位中的各个二进制位左移或右移一位,也可以将一个存储单位中所有的 ...
- hdoj1150(最小点覆盖)
题意: 两台机器,A台机器有N种模式,B台机器有M种不同的模式,初始模式都是0 以及K个需要运行的任务(i,x,y),在A台机器是x模式,在B台机器是y模式. 请合理为每个任务安排一台机器并合理安排顺 ...
- Unity3D NGUI UIPlayTween(原UIButtonTween)动画事件详解
http://blog.csdn.net/asd237241291/article/details/8507817 原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术 ...
- mysql 分区后查询效率
准备工作: 蠕虫复制 文章表 增加数据到112万 语法:insert into tableNameA select * from tableNameB 未分区查询 54s 改变现有表 ...
- Python入门小练习-001-备份文件
练习适用于LINUX,类Unix系统,一步一个脚印提高Python . 001. 类Unix系统中用zip命令将文件压缩备份至 /temporary/ 目录下: import os import ti ...
- bzoj 5015 [Snoi2017]礼物
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5015 题解 首先把k=1,k=2,k=3的手推一遍 然后发现一些规律 就是数列可以表示成$a ...
- AtCoder Grand Contest 012 A
A - AtCoder Group Contest Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statem ...