分析:求出最大值和最小值比较简单,使用贪心法,求最小值的时候我们让所有的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. LeetCode OJ 62. Unique Paths

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  2. 第三次冲刺spring会议(第四次会议)

    [例会时间]2014/5/23 21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳奇

  3. Openjudge-计算概论(A)-求一元二次方程的根

    描述: 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2 + bx + c =0的根 ...

  4. ubuntu下的ssh工具gstm

    (转自:http://www.nenew.net/ubuntu-ssh-gstm.html) 首先安装: sudo apt-get install gstm 就可以安装,当然你也可以到http://s ...

  5. maven下载,安装与eclipse中maven配置

    1.maven下载.安装与环境变量配置 http://blog.csdn.net/jiuqiyuliang/article/details/45390313 2.Eclipse中maven的配置 ht ...

  6. android 实践项目

    电子词典  http://files.cnblogs.com/blogLYF/lyf_danci.apk

  7. HDU - 1045 Fire Net(二分匹配)

    Description Suppose that we have a square city with straight streets. A map of a city is a square bo ...

  8. c语言-扑克牌小魔术

    /************************************* Copyright(C) 2004-2005 vision,math,NJU. File Name: guess_card ...

  9. C# 系统应用之清除Cookies、IE临时文件、历史记录 转载

    http://blog.csdn.net/Eastmount/article/details/18821221 本文主要是项目"个人电脑使用记录清除软件"系类文章中关于清除浏览器C ...

  10. bfs UESTC 381 Knight and Rook

    http://acm.uestc.edu.cn/#/problem/show/381 题目大意:给你两个棋子:车.马,再给你一个n*m的网格,从s出发到t,你可以选择车或者选择马开始走,图中有一些障碍 ...