{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动态规划小测(一)的更多相关文章

  1. Day 5 笔记 dp动态规划

    Day 5 笔记 dp动态规划 一.动态规划的基本思路 就是用一些子状态来算出全局状态. 特点: 无后效性--狗熊掰棒子,所以滚动什么的最好了 可以分解性--每个大的状态可以分解成较小的步骤完成 dp ...

  2. DP动态规划学习笔记——高级篇上

    说了要肝的怎么能咕咕咕呢? 不了解DP或者想从基础开始学习DP的请移步上一篇博客:DP动态规划学习笔记 这一篇博客我们将分为上中下三篇(这样就不用咕咕咕了...),上篇是较难一些树形DP,中篇则是数位 ...

  3. 树形DP——动态规划与数据结构的结合,在树上做DP

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...

  4. 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解

    前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...

  5. 小测几种python web server的性能

    http://blog.csdn.net/raptor/article/details/8038476 因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-ws ...

  6. hdu 3709 数字dp(小思)

    http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...

  7. [福大软工] Z班 团队作业——随堂小测(同学录) 作业成绩

    团队作业--随堂小测(同学录) 作业链接 http://www.cnblogs.com/easteast/p/7763645.html 作业情况 本次作业从原先预计的3小时,有些组打了鸡血连续肝了4. ...

  8. 福州大学软件工程1816 | W班 第8次作业[团队作业,随堂小测——校友录]

    作业链接 团队作业,随堂小测--校友录 评分细则 本次个人项目分数由两部分组成(博客分满分40分+程序得分满分60分) 博客和程序得分表 评分统计图 千帆竞发图 总结 旅法师:实现了更新,导出,查询, ...

  9. MySQL课堂小测

    目录 一.基本知识与操作方法 二.小测具体内容 (一)向数据库表中添加记录 (二)下载并导入world.sql (三)数据库查询与输出 (四)查询数据库并求某字段和 (五)查询数据库并取最大& ...

随机推荐

  1. Atititcmd cli环境变量的调用设置与使用

    Atititcmd cli环境变量的调用设置与使用 1.1. Cgi 环境变量的调用设置与使用1 1.2. 环境变量vs  系统变量1 1.3. 环境变量的分类 A.与服务器相关的环境变量B ,与客户 ...

  2. Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15

    Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15 1. attilax重要案例的分类(atiuse,auBackTech,bizImp)3 1.1. 两个book3 1.2. ...

  3. mysql如果数据不存在,则插入新数据,否则更新的实现方法

    mysql如果数据不存在,则插入新数据,否则更新的实现方法 //如果不存在,则插入新数据 $sql = "INSERT INTO {$ecs->table('cat_lang')} ( ...

  4. 如何优雅的使用vue+vux开发app -02

    如何优雅的使用vue+vux开发app -02 很明显这又是一个错误的示范,请勿模仿 使用动态组件实现保留状态的路由 <!DOCTYPE html> <html> <he ...

  5. KnockoutJS 3.X API 第四章 表单绑定(9) value绑定

    目的 value绑定主要用于DOM元素给视图模型赋值用的.通常用于<input><select><textarea>等元素. value绑定与text绑定的区别在于 ...

  6. Ubuntu14中supervisor的安装及配置

    supervisor是一款很好用的进程管理工具,其命令也很简单,其安装过程如下: Ubuntu14: 首先保证本地的Python环境是OK的,并且已经安装supervisor包,如果没有安装可以用ea ...

  7. 微软BI 之SSIS 系列 - 使用 SQL Profilling Task (数据探测) 检测数据源数据

    开篇介绍 SQL Profilling Task 可能我们很多人都没有在 SSIS 中真正使用过,所以对于这个控件的用法可能也不太了解.那我们换一个讲法,假设我们有这样的一个需求 - 需要对数据库表中 ...

  8. WPF自定义控件与样式(14)-轻量MVVM模式实践

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. MVVM是WPF中一个非 ...

  9. 本机搭建zookeeper集群

    3个 clientPort分别设置为2181,2182,2083 server.1=127.0.0.1:2888:3888 server.2=127.0.0.2:2889:3889 server.3= ...

  10. 邻接表有向图(三)之 Java详解

    前面分别介绍了邻接表有向图的C和C++实现,本文通过Java实现邻接表有向图. 目录 1. 邻接表有向图的介绍 2. 邻接表有向图的代码说明 3. 邻接表有向图的完整源码 转载请注明出处:http:/ ...