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

  这就是组合数学版的dp了,我们让dp[i][j]表示当前i个0,和前j个1被接收后所能形成的数字个数,初始条件为dp[0][0] = 1; 决策有两种,第一种转移到dp[i+1][j]也就是多接收一个0,这时候定义F1[]数组记录1的发送时间,F0[]数组记录0的发送时间,那么如上方程的转移条件为 F1[j+1]+d >= F0[i+1],也就是第i+1个0能先于第j+1个1被接收。另一种转移到dp[i][j+1],也是一样的道理。最后注意一下边界的特判,dp[sum0][sum1]就是答案。

  注意: 关于上述方法有人可能会问,我们在同一时刻接收到了多个数字,按照题目要求应该自由排列,为什么上述方法,完全没有体现到这一点呢? 不要被迷惑了,我们关心的是多少个1和0被接收,而不是哪个1先被接收,我们的循环里完全记录下了各种情况的个数。

  坑点:这个题的数组范围很大,如果不用unsighed long long,就会爆long long,我也因为这个WA了很多次。

  代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define LL unsigned long long
#define N 70
int n,d,bit[N];
struct ID{
int s1,s0;
}id[N];
LL k;
void Get_Bit(){
LL tmp = k;
int ip = ;
memset(bit,,sizeof(bit));
while(tmp)
{
if(tmp&) bit[ip] = ;
ip++;
tmp >>= ;
}
}
LL mypow(int x){
LL tmp = ;
for(int i = ;i <= x;i++) tmp *= ;
return tmp;
}
LL Get_Min(){
for(int i = ;i <= n;i++){
if(bit[i]) {id[i].s1 = ; id[i].s0 = ;}
else {id[i].s0 = ; id[i].s1 = ;}
}
for(int i = n;i >= ;i--){
if(bit[i]){
id[i].s1--;
if(i-d >= ) id[i-d].s1++;
else id[].s1++;
}
}
LL Min = ;
int ip = ;
for(int i = ;i <= n;i++){
while(id[i].s1 > ) {Min += mypow(ip); id[i].s1--; ip++;}
while(id[i].s0 > ) {ip++; id[i].s0--;}
}
// cout<<"MIN = "<<Min<<endl;
return Min;
}
LL Get_Max(){
for(int i = ;i <= n;i++){
if(bit[i]) {id[i].s1 = ; id[i].s0 = ;}
else {id[i].s0 = ; id[i].s1 = ;}
}
for(int i = n;i >= ;i--){
if(bit[i]==){
id[i].s0--;
if(i-d >= ) id[i-d].s0++;
else id[].s0++;
}
}
LL Max = ;
int ip = ;
for(int i = ;i <= n;i++){
while(id[i].s0 > ) {id[i].s0--; ip++;}
while(id[i].s1 > ) {Max += mypow(ip); ip++; id[i].s1--;}
}
// cout<<"MAX = "<<Max<<endl;
return Max;
}
LL Get_Ans(){
LL dp[N][N];
int sum0=,sum1=,f1[N],f0[N];
memset(dp,,sizeof(dp));
for(int i = n;i >= ;i--){
if(bit[i]) f1[++sum1] = n-i+;
else f0[++sum0] = n-i+;
}
dp[][] = ;
for(int i = ;i <= sum0;i++){
for(int j = ;j <= sum1;j++){
if(j == sum1 && i < sum0) dp[i+][j] += dp[i][j];
if(i == sum0 && j < sum1) dp[i][j+] += dp[i][j];
if(i==sum0 || j==sum1) continue;
if(f1[j+]+d >= f0[i+]) dp[i+][j] += dp[i][j];
if(f0[i+]+d >= f1[j+]) dp[i][j+] += dp[i][j];
}
}
return dp[sum0][sum1];
}
int main()
{
LL Min,Max,ans,ca=;
while(cin>>n){
if(n==) break;
cin>>d>>k;
Get_Bit();
Min = Get_Min();
Max = Get_Max();
ans = Get_Ans();
cout<<"Case "<<++ca<<": "<<ans<<" "<<Min<<" "<<Max<<endl;
}
return ;
}

UVALive 4031 Integer Transmission(贪心 + DP)的更多相关文章

  1. 【BZOJ-3174】拯救小矮人 贪心 + DP

    3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 686  Solved: 357[Submit][Status ...

  2. BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP

    BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...

  3. 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp

    正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...

  4. 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp

    题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...

  5. 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp

    题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...

  6. hdu 1257 最少拦截系统【贪心 || DP——LIS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  7. 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人

    P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...

  8. 贪心+dp

    贪心+dp 好多题都是这个思想, 可以说是非常重要了 思想一: 在不确定序列无法dp的情况下, 我们不妨先假设序列已经选定, 而利用贪心使序列达到最优解, 从而先进行贪心排序, 在进行dp选出序列 思 ...

  9. 【题解】CF1056F Write the Contest(三分+贪心+DP)

    [题解]CF1056F Write the Contest(三分+贪心+DP) 最优化问题的三个解决方法都套在一个题里了,真牛逼 最优解应该是怎样的,一定存在一种最优解是先完成了耗时长的任务再干别的( ...

随机推荐

  1. 使用Apache + mod_jk + tomcat来实现tomcat集群的负载均衡出现的无法加载mod_jk.conf文件的问题

    用Apache + mod_jk + tomcat来实现tomcat集群的负载均衡的 如果出现了问题,可以用cmd  cd到Apache安装文件的bin下,运行httpd文件,错误信息就会打印出来. ...

  2. SpringMVC集成shrio框架

    使用SHIRO的步骤:1,导入jar2,配置web.xml3,建立dbRelm4,在Spring中配置 添加所需jar包: <!--Apache Shiro所需的jar包--> <d ...

  3. VMWare网络链接三种方式

    本文转自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/03/15/1985084.html VMware虚拟机上网络连接(networ ...

  4. iOS 视图控制器生命周期

    1.init: 2.viewDidLoad: 3.viewWillAppear: 4.viewDidAppear: 5.viewWillDisappear; 6.viewDidDisappear

  5. 查询mysql中经纬度判断坐标范围

    先上代码,稍后附上说明: 1. 从mysql中取出记录,打印有效经纬度: import json import MySQLdb # lines = c.fetchall() #所有的记录,一个tupl ...

  6. HDU1115--Lifting the Stone(求凸多边形的重心)

    Problem Description There are many secret openings in the floor which are covered by a big heavy sto ...

  7. HBase全分布安装配置

    分布式的hbase依赖于Zookeeper集群所有正常工作节点都必须能够访问zookeeper:用户可以通过启动和关闭脚本就可以把zookeeper当做hbase的一部分来启动和关闭进程:当然,用户也 ...

  8. C语言_error_MSB8031

    关于Visual Studio 2013 编译 multi-byte character set MFC程序出现 MSB8031 错误的解决办法 Visual Studio 2013 编译旧的 mul ...

  9. ShellExecute, WinExec, CreateProcess区别

    ShellExecute ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件.打开一个目录.打印一个文件等等),并对外部程序有一定的控制. 有几个API函数都可以实现这些功能 ...

  10. 句柄C++

    C++中的句柄 这个句柄只是从英文handle翻译过来的,只问句是什么意思难以解释,这个是我从别人的空间收集的信息, 功能上的理解: 什么是"句柄"(handle),handle的 ...