{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. KnockoutJS 3.X API 第五章 高级应用(5) 使用预处理扩展Knockout绑定语法

    注意:这是一种高级技术,通常仅在创建可重用绑定或扩展语法的库时使用. 这不是你通常需要做的时候使用Knockout构建应用程序. 从Knockout 3.0开始,开发人员可以通过提供在绑定过程中重写D ...

  2. 【WP开发】实现“摇一摇”功能

    尽管我的微信是每八个月登录一次,但我相信各位玩得比我多.微信有一个“摇一摇”功能,这个功能其实是利用了加速度传感器来实现的,这个传感器,我估计再低端的手机都会有的,这是严重基本的传感器. 重力加速度既 ...

  3. mac下网页中文字体优化

    最近某人吐槽某门户网站在mac下chrome字体超丑,然后发现虽然现在mac用户越来越多,但是大家依然无视mac下的字体差异,于是研究了下mac下网页中的中文字体,和大家分享. 看了一遍国内各大门户和 ...

  4. .NET面试题解析(06)-GC与内存管理

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 GC作为.NET的重要核心基础,是必须要了解的.本文主要侧重于GC内存管理中的一些关键点,如要要全面深入了 ...

  5. JS实现单击按钮后弹出新的窗口页面

    点击按钮后,弹出指定大小的页面窗口. 效果图: 源码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  6. 让你心动的 HTML5 & CSS3 效果【附源码下载】

    这里集合的这组 HTML5 & CSS3 效果,有的是网站开发中常用的.实用的功能,有的是先进的 Web 技术的应用演示.不管哪一种,这些案例中的技术都值得我们去探究和学习. 超炫的 HTML ...

  7. 推荐10个 CSS3 制作的创意下拉菜单效果

    下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...

  8. android gridview几个重要属性(android:listSelector自带内部padding分析)

    一.android:scrollbarStyle  决定状态条的位置     常用属性outsideOverlay,滚动条在最外层,gridview设置的padding在滚动条的内侧   二.andr ...

  9. [New Portal]Windows Azure Virtual Machine (15) 在本地制作数据文件VHD并上传至Azure(2)

    <Windows Azure Platform 系列文章目录> 在上一章内容里,我们已经将包含有OFFICE2013 ISO安装文件的VHD上传至Azure Blob Storage中了. ...

  10. redis学习教程之一基本命令

    参阅redis中文的 互动教程(interactive tutorial)来学习的. 目录: 全局操作 get  get incr  自增 del 删除 expire 定时 list  队列 set ...