UVALive 4031 Integer Transmission(贪心 + DP)
分析:求出最大值和最小值比较简单,使用贪心法,求最小值的时候我们让所有的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)的更多相关文章
- 【BZOJ-3174】拯救小矮人 贪心 + DP
3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 686 Solved: 357[Submit][Status ...
- BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP
BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...
- 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp
正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...
- 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp
题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...
- 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp
题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...
- hdu 1257 最少拦截系统【贪心 || DP——LIS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人
P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...
- 贪心+dp
贪心+dp 好多题都是这个思想, 可以说是非常重要了 思想一: 在不确定序列无法dp的情况下, 我们不妨先假设序列已经选定, 而利用贪心使序列达到最优解, 从而先进行贪心排序, 在进行dp选出序列 思 ...
- 【题解】CF1056F Write the Contest(三分+贪心+DP)
[题解]CF1056F Write the Contest(三分+贪心+DP) 最优化问题的三个解决方法都套在一个题里了,真牛逼 最优解应该是怎样的,一定存在一种最优解是先完成了耗时长的任务再干别的( ...
随机推荐
- incallui中如何查询联系人数据
联系人信息显示在CallCard中,提示当前正在通话的联系人号码.姓名.头像.号码类型等信息: 代码中在两个地方发起对当前联系人的查询, Init():startContactInfoSearch(c ...
- MySQL5.5.源码安装
MySQL5.5.34安装需要用到cmke ncurses-devel yum install -y ncurses-devel cmake gcc gcc-c++ bison 下载http://m ...
- 如何直观的解释back propagation算法?
转自:知乎-https://www.zhihu.com/question/27239198 作者:匿名用户链接:https://www.zhihu.com/question/27239198/answ ...
- android异步Http框架
首先在GitHub上下载异步Http框架代码以及相关文档: 将jar包放入lib包中即可: 接下来分别实现get.post.文件上传功能实现: 代码实现如下: AsyncHttpClient clie ...
- Android截图命令screencap
查看帮助命令 bixiaopeng@bixiaopeng ~$ adb shell screencap -v screencap: invalid option -- v usage: screenc ...
- 第四十三节,文件、文件夹、压缩包、处理模块shutil
文件.文件夹.压缩包.处理模块shutil 文件处理 copyfileobj()模块函数 功能:将a文件的内容,复制到b文件中[有参] 使用方法:模块名称.copyfileobj(poen(" ...
- CentOS中由一般用户切换为root用户
--->http://www.centoscn.com/CentOS/help/2014/0624/3173.html 1.打开终端,提示符为“$”,表明该用户为普通用户,此时,直接输su,回车 ...
- Javascript调用 ActiveXObject导出excel文档。
function makeDataBook(){ var xls = new ActiveXObject ("Excel.Application"); xls.visible = ...
- 给php代码添加规范的注释phpDocumentor
给php代码添加规范的注释更多参考 http://phpdoc.org/docs/latest/index.html在phpdocumentor中,注释分为文档性注释和非文档性注释.所谓文档性注释,是 ...
- JavaScript跨域总结与解决办法 什么是跨域
什么是跨域 1.document.domain+iframe的设置 2.动态创建script 3.利用iframe和location.hash 4.window.name实现的跨域数据传输 5.使用H ...