【USACO】DP动态规划小测(一)
{20160927 19:30~21:30}
总分400分,我113.33,稳稳地垫底了......(十分呼应我上面的博客名,hhh~)过了这么多天我才打完所有代码,废话我也就不多说了。不过,虽然时间花费的多,但我觉得我的PG也是“博采众长”了。
-------------------------------------------------------------------------------------------------------------------------------------------------
T1 接住苹果(bcatch)
题意:有2颗苹果树,有K次移动机会,问最多能接到的苹果数。
解法:可以用f[i][j][2]或f[i][j]和g[i][j]来实现,表示掉了i个苹果,移动j次的最大值。也可以利用j的奇偶直接判断当前在的树,进而进行+1或0。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; const int N=,K=;
int f[N][K],g[N][K],a[N]; int mmax(int x,int y)
{ return x>y?x:y; } int main()
{
//freopen("bcatch.in","r",stdin);
//freopen("bcatch.out","w",stdout);
int n,k;
scanf("%d%d",&n,&k);
for (int i=;i<=n;i++) scanf("%d",&a[i]),a[i]--;
int x,y,ans=;
memset(f,,sizeof(f));
memset(g,,sizeof(g));
for (int i=;i<=n;i++)
for (int j=;j<=k;j++)
{
x=-a[i],y=-x;
f[i][j]=x+f[i-][j],g[i][j]=y+g[i-][j];
if (j>)
{
f[i][j]=mmax(f[i][j],x+g[i-][j-]);
g[i][j]=mmax(g[i][j],y+f[i-][j-]);
}
if (i==n) ans=mmax(ans,mmax(f[i][j],g[i][j]));
}
printf("%d\n",ans);
return ;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
T2 滑雪课程(ski)
题意:有N个雪坡和S个课程。雪坡需要耗费一定的时间,且有技能点要求,课程也需要耗费一定的时间,但可以进修到一定的技能点数。问在时间T内最多能滑多少次雪坡。
有两种解法:(时间和内存哪种更优就看数据范围了~)
1.f[i][j]表示前i的时间内能力为j时能滑雪的最大次数,预处理一下p[i]为当能力为i时能花的所有雪坡中耗费时间最小的。每次分别用f[i][j]更新现在有课上便上课,和滑一次雪的状态。
注意——边界条件;只有当前状态存在(不为-1)才可拓展到其他的状态;f[i][j]除了更新上课或滑雪的,也要更新到f[i+1][j]。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int T=(int)1e4+,S=,N=(int)1e5+,C=;
int f[T][C],p[C+];
struct node{int c,d;}a[N];
struct hy{int m,l,c;}b[S]; bool cmp(hy x,hy y) {return x.m<y.m;}
void upd(int &x,int y) {x=x>y?x:y;}
void upd2(int &x,int y) {x=x<y?x:y;}
int mabs(int x) {return x>?x:-x;} int main()
{
//freopen("ski.in","r",stdin);
//freopen("ski.out","w",stdout);
int t,s,n;
scanf("%d%d%d",&t,&s,&n);
for (int i=;i<=s;i++)
scanf("%d%d%d",&b[i].m,&b[i].l,&b[i].c);
sort(b,b++s,cmp);
for (int i=;i<=n;i++)
scanf("%d%d",&a[i].c,&a[i].d);
memset(p,,sizeof(p));
for (int i=;i<=n;i++)
upd2(p[a[i].c],a[i].d);
for (int i=;i<=C;i++)
upd2(p[i],p[i-]);
int tmp=,ans=;
memset(f,-,sizeof(f));
f[][]=;
for (int i=;i<=t;i++)
{
for (int j=;j<=C;j++)
{
if (f[i][j]<) continue;//
upd(f[i+][j],f[i][j]);
upd(f[i+p[j]][j],f[i][j]+);
while (b[tmp].m==i && tmp<=s && i+b[tmp].l<=t)
upd(f[i+b[tmp].l][b[tmp].c],f[i][j]), tmp++;
if (i==t) upd(ans,f[i][j]);
}
}
printf("%d\n",ans);
return ;
}
1
2.f[i]表示上了第i节课能滑雪的最大次数,预处理同上。每次f[i]存枚举上一次上了哪节课,而到这节课的时间里滑雪或上课的最佳答案。
注意——边界条件;添加时间为0和时间为t的课程,保证“有始有终”。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int T=(int)1e4+,S=,N=(int)1e5+,C=;
int f[S],p[C+];
struct node{int c,d;}a[N];
struct hy{int m,l,c;}b[S]; //bool cmp(hy x,hy y) {return x.m<y.m;}
void upd(int &x,int y) {x=x>y?x:y;}
void upd2(int &x,int y) {x=x<y?x:y;}
int mabs(int x) {return x>?x:-x;} int main()
{
//freopen("ski.in","r",stdin);
//freopen("ski.out","w",stdout);
int t,s,n,ans=;
scanf("%d%d%d",&t,&s,&n);
for (int i=;i<=s;i++)
scanf("%d%d%d",&b[i].m,&b[i].l,&b[i].c);
b[].m=,b[].l=,b[].c=;
b[++s].m=t;//add terminal
//sort(b,b+1+s,cmp);//无须排序
for (int i=;i<=n;i++)
scanf("%d%d",&a[i].c,&a[i].d);
memset(p,,sizeof(p));
for (int i=;i<=n;i++)
upd2(p[a[i].c],a[i].d);
for (int i=;i<=C;i++)
upd2(p[i],p[i-]);
memset(f,-,sizeof(f));
f[]=;
for (int i=;i<=s;i++)
{
if (b[i].l+b[i].m>t) continue;//
for (int j=;j<i;j++)
if (f[j]>= && b[i].m>=b[j].m+b[j].l)//
upd(f[i],f[j]+mabs(b[i].m-b[j].m-b[j].l)/p[b[j].c]);
upd(ans,f[i]);
}
printf("%d\n",ans);
return ;
}
2
--------------------------------------------------------------------------------------------------------------------------------------------------
T3 滑雪比赛(bobsled)
题意:初始速度为1,有N个限制速度大小的弯道,给出与起点的距离,问L内最大能达到的速度。
解法:先贪心——从后往前扫一遍来保证各弯道间的限制速度可以互相到达,因为速度有后效性(?),便直接保证了不用比较下一个的限制速度,还担心降不到下一个的限制速度。
接着保存每到一个弯道后的速度与距离,进而根据与下一个弯道的速度曲线的单调性(递增(多)---递减(少)、递增、递增(少)---递减(多)、递减)来算出其间的最大值,和到下一个弯道的速度。P.S.画图辅助会清晰一点。
注意——终点也可看成一个“弯道”,而没有限制速度。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int L=(int)1e9+,N=(int)1e5+;
struct node{int t,v;}
a[N]; bool cmp(node x,node y)
{
if (x.t!=y.t) return x.t<y.t;
return x.v<y.v;
}
int mmax(int x,int y)
{ return x>y?x:y; }
int mmin(int x,int y)
{ return x<y?x:y; }
int main()
{
//freopen("bobsled.in","r",stdin);
//freopen("bobsled.out","w",stdout);
int l,n;
scanf("%d%d",&l,&n);
for (int i=;i<=n;i++)
scanf("%d%d",&a[i].t,&a[i].v);
sort(a+,a++n,cmp);
int p=;a[].t=-;
for (int i=;i<=n;i++)
if (a[i].t!=a[i-].t) a[++p]=a[i];
n=p;
for (int i=n-;i>=;i--)
a[i].v=mmin(a[i].v,a[i+].v+(a[i+].t-a[i].t));
int t=,v=;//now
int x,ans=;
for (int i=;i<=n;i++)
{
if (a[i].v>v)
{
if (a[i].t-t>=a[i].v-v)//=
x=a[i].v+((a[i].t-t)-(a[i].v-v))/,v=a[i].v;
else x=v+(a[i].t-t),v=x;
ans=mmax(ans,x);
}
else
{
x=v+((a[i].t-t)-(v-a[i].v))/;
v=a[i].v;
ans=mmax(ans,x);
}
t=a[i].t;
}
ans=mmax(ans,v+(l-t));
printf("%d\n",ans);
return ;
}
--------------------------------------------------------------------------------------------------------------------------------------------------
T4 奶牛飞盘队(fristeam)
题意:有N头有一定能力的奶牛,问选出能力和为M的倍数的方案总数。
解法:要想到把%M的值作为DP数组的一个维度。f[i][j]表示在前i头奶牛中选到的能力和%M为j的方案数,这样每次只需分别选或不选当前第i头奶牛,由f[i-1]的状态推出。
注意——最后答案要 -1,因为初始f[0][0]=1是为了方便计算,而实际为0的。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; const int N=,M=,mod=(int)1e8;
int a[N],f[N][M]; int main()
{
//freopen("fristeam.in","r",stdin);
//freopen("fristeam.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
scanf("%d",&a[i]),a[i]%=m;
for (int j=;j<m;j++) f[][j]=;
f[][]=;
for (int i=;i<=n;i++)
for (int j=;j<m;j++)
{
int x=j-a[i];
if (x<) x+=m;
f[i][j]=(f[i-][j]+f[i-][x])%mod;
}
printf("%d\n",f[n][]-);
return ;
}
【USACO】DP动态规划小测(一)的更多相关文章
- Day 5 笔记 dp动态规划
Day 5 笔记 dp动态规划 一.动态规划的基本思路 就是用一些子状态来算出全局状态. 特点: 无后效性--狗熊掰棒子,所以滚动什么的最好了 可以分解性--每个大的状态可以分解成较小的步骤完成 dp ...
- DP动态规划学习笔记——高级篇上
说了要肝的怎么能咕咕咕呢? 不了解DP或者想从基础开始学习DP的请移步上一篇博客:DP动态规划学习笔记 这一篇博客我们将分为上中下三篇(这样就不用咕咕咕了...),上篇是较难一些树形DP,中篇则是数位 ...
- 树形DP——动态规划与数据结构的结合,在树上做DP
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...
- 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解
前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...
- 小测几种python web server的性能
http://blog.csdn.net/raptor/article/details/8038476 因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-ws ...
- hdu 3709 数字dp(小思)
http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...
- [福大软工] Z班 团队作业——随堂小测(同学录) 作业成绩
团队作业--随堂小测(同学录) 作业链接 http://www.cnblogs.com/easteast/p/7763645.html 作业情况 本次作业从原先预计的3小时,有些组打了鸡血连续肝了4. ...
- 福州大学软件工程1816 | W班 第8次作业[团队作业,随堂小测——校友录]
作业链接 团队作业,随堂小测--校友录 评分细则 本次个人项目分数由两部分组成(博客分满分40分+程序得分满分60分) 博客和程序得分表 评分统计图 千帆竞发图 总结 旅法师:实现了更新,导出,查询, ...
- MySQL课堂小测
目录 一.基本知识与操作方法 二.小测具体内容 (一)向数据库表中添加记录 (二)下载并导入world.sql (三)数据库查询与输出 (四)查询数据库并求某字段和 (五)查询数据库并取最大& ...
随机推荐
- Atititcmd cli环境变量的调用设置与使用
Atititcmd cli环境变量的调用设置与使用 1.1. Cgi 环境变量的调用设置与使用1 1.2. 环境变量vs 系统变量1 1.3. 环境变量的分类 A.与服务器相关的环境变量B ,与客户 ...
- Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15
Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15 1. attilax重要案例的分类(atiuse,auBackTech,bizImp)3 1.1. 两个book3 1.2. ...
- mysql如果数据不存在,则插入新数据,否则更新的实现方法
mysql如果数据不存在,则插入新数据,否则更新的实现方法 //如果不存在,则插入新数据 $sql = "INSERT INTO {$ecs->table('cat_lang')} ( ...
- 如何优雅的使用vue+vux开发app -02
如何优雅的使用vue+vux开发app -02 很明显这又是一个错误的示范,请勿模仿 使用动态组件实现保留状态的路由 <!DOCTYPE html> <html> <he ...
- KnockoutJS 3.X API 第四章 表单绑定(9) value绑定
目的 value绑定主要用于DOM元素给视图模型赋值用的.通常用于<input><select><textarea>等元素. value绑定与text绑定的区别在于 ...
- Ubuntu14中supervisor的安装及配置
supervisor是一款很好用的进程管理工具,其命令也很简单,其安装过程如下: Ubuntu14: 首先保证本地的Python环境是OK的,并且已经安装supervisor包,如果没有安装可以用ea ...
- 微软BI 之SSIS 系列 - 使用 SQL Profilling Task (数据探测) 检测数据源数据
开篇介绍 SQL Profilling Task 可能我们很多人都没有在 SSIS 中真正使用过,所以对于这个控件的用法可能也不太了解.那我们换一个讲法,假设我们有这样的一个需求 - 需要对数据库表中 ...
- WPF自定义控件与样式(14)-轻量MVVM模式实践
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. MVVM是WPF中一个非 ...
- 本机搭建zookeeper集群
3个 clientPort分别设置为2181,2182,2083 server.1=127.0.0.1:2888:3888 server.2=127.0.0.2:2889:3889 server.3= ...
- 邻接表有向图(三)之 Java详解
前面分别介绍了邻接表有向图的C和C++实现,本文通过Java实现邻接表有向图. 目录 1. 邻接表有向图的介绍 2. 邻接表有向图的代码说明 3. 邻接表有向图的完整源码 转载请注明出处:http:/ ...