Round#1 2016.9.28

这次晚练十分sb 有点浪费时间 全是dp题

先说过程 3分钟草了第一题之后感觉好像有点水 然后翻了翻题目 看了看第一第四题两颗星 其他三颗星 然后一下子第二题题目太长就兴起草第三题 打了四十五分钟然后草第二题 然后就没了要收卷(第二题还没调完 给多我五分钟就A了) 整体用了一个半小时吧(马力有点弱..)

三维dp 你也可以变成N和K的dp只是麻烦一点 这题不会可以退役

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define Maxn 1010
using namespace std;
int F[Maxn][][]; int T[Maxn];
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",&T[i]);
for(int i=;i<=N;i++)
{
for(int j=;j<=K;j++)
{
F[i][j][]=max(F[i][j][],max(F[i-][j][],F[i-][j-][])+(T[i]==));
F[i][j][]=max(F[i][j][],max(F[i-][j][],F[i-][j-][])+(T[i]==));
}
}
int maxx=;
for(int i=;i<=K;i++) for(int j=;j<=;j++) maxx=max(maxx,F[N][i][j]);
return printf("%d\n",maxx),;
}
/*
7
2
1
1
2
2
1
1
*/

第二题题目很烦 条件很多 我们发现斜坡是越短越好 然后用时间和能力值dp一下随便草就好了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
struct Course
{
int m,l,a;
}C[];
bool Cmp(const Course &x,const Course &y){return x.m<y.m;}
struct XP
{
int c,d;
}X[];
int T,S,N;
int F[][]; int L[];
int main()
{
freopen("ski.in","r",stdin);
freopen("ski.out","w",stdout);
scanf("%d%d%d",&T,&S,&N);
for(int i=;i<=S;i++) scanf("%d%d%d",&C[i].m,&C[i].l,&C[i].a);
sort(C+,C+S+,Cmp);
for(int i=;i<=N;i++) scanf("%d%d",&X[i].c,&X[i].d); for(int i=;i<=;i++) L[i]=;
for(int i=;i<=N;i++) L[X[i].c]=min(L[X[i].c],X[i].d);
for(int i=;i<=;i++) L[i]=min(L[i],L[i-]); for(int i=;i<=T;i++) for(int j=;j<=;j++) F[i][j]=-;
F[][]=; int l=; int r=;
for(int i=;i<=T;i++)
{
while(C[r].m==i) r++;
for(int j=;j<=;j++)
{
if(F[i][j]!=-)
{
F[i+][j]=max(F[i+][j],F[i][j]);
if(i+L[j]<=T) F[i+L[j]][j]=max(F[i+L[j]][j],F[i][j]+);
for(int k=l;k<r;k++) if(i+C[k].l<=T) F[i+C[k].l][C[k].a]=max(F[i+C[k].l][C[k].a],F[i][j]);
}
}
l=r;
}
int maxx=;
for(int i=;i<=T;i++) for(int j=;j<=;j++) maxx=max(maxx,F[i][j]);
return printf("%d\n",maxx),;
}
/*
10 1 2
3 2 5
4 1
1 3
*/

第三题也想了一会儿 我们发现有一些状态我们是一定到不了的 就好比

7 3

8 5

其实8的时候最多为4 就改一下 还有一种

7 3

8 1

那么你7是要改成2的

先从后面扫一遍 然后前面再扫一遍到后面(先后顺序不知道可不可以换 应该可以吧 考场上没多想)

剩下的话都是可以到的 然后每次都到这个速度就是最优的因为你如果合法 但是又小于这个速度就是最差的 那么的话每两个点之间你就把它们先升到一个高度然后再往上飞最长的一段再下来

最后还要判断一下到终点 (就这样没了两个点)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define Maxn 100010
using namespace std;
bool Cmp(const pair<int,int> &x,const pair<int,int> &y){if(x.first!=y.first) return x.first<y.first; return x.second>y.second;}
int L,M; pair<int,int>pr[Maxn];
int F[Maxn];
int main()
{
freopen("bobsled.in","r",stdin);
freopen("bobsled.out","w",stdout);
scanf("%d%d",&L,&M); for(int i=;i<=M;i++) scanf("%d%d",&pr[i].first,&pr[i].second);
sort(pr+,pr+M+,Cmp); memset(F,,sizeof(F)); F[]=;
for(int i=;i<=M;i++) F[i]=min(F[i],pr[i].second);
for(int i=M;i>=;i--)
{
if(pr[i].first!=pr[i+].first)
{
F[i]=min(F[i],F[i]+(F[i+]-F[i])+(pr[i+].first-pr[i].first));
}
else F[i]=F[i+];
} int l;
for(int i=;i<=M;i=l+)
{
l=i; while(pr[l].first==pr[l+].first) l++;
if(pr[l].first!=pr[i-].first)
{
F[l]=min(F[l],F[l]+((F[i-]-F[l])+(pr[l].first-pr[i-].first)));
}
for(int j=i;j<=l;j++) F[j]=F[l];
} int ans=;
for(int i=;i<=M;i++) ans=max(ans,max(F[i],F[i-])+(pr[i].first-pr[i-].first-abs(F[i]-F[i-]))/);
ans=max(ans,F[M]+(L-pr[M].first));
return printf("%d\n",ans),;
} /*
14 3
7 3
11 1
13 8
*/

看看范围 好像直接背包会爆 很明显这道题给出来的做法一定是NM 然后想想背包可不可以换种方式

看到都是M的倍数 也就是说 M以上的都可以变成小于M咯 其它也要保留一下 然后F[N][i]表示现在放到第I个物品 然后M的倍数+i 然后再用一个数组辅助转移搞一下就好了 差不多绕圈的dp

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define Maxn 2010
using namespace std;
const int Mod=1e8;
int N,M; int A[Maxn]; int F[Maxn]; bool bo[Maxn]; int G[Maxn];
int main()
{
freopen("fristeam.in","r",stdin);
freopen("fristeam.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=;i<=N;i++) scanf("%d",&A[i]);
memset(F,,sizeof(F)); F[]=; memset(G,,sizeof(G)); memset(bo,,sizeof(bo)); bo[]=;
for(int i=;i<=N;i++)
{
for(int j=;j<M;j++) G[j]=;
for(int j=;j<M;j++)
if(bo[j]) G[(j+A[i])%M]=(G[(j+A[i])%M]+F[j])%Mod,bo[(j+A[i])%M]=;
for(int j=;j<M;j++)
if(bo[j]) F[j]=(F[j]+G[j])%Mod;
}
return printf("%d\n",F[]-),;
}
/*
4 5
1
2
8
2
*/

Round #2 2016.9.29

这次题目好像上了点难度,有点意思了

第一题考场上看错题意 以为中间有一个高的就不能跨过去 其它都可以..

当我back回的时候 才发现那条线要是直的 所以的话用斜率搞一下 画画图 很容易把O(N^3)变成O(N^2)

有空再更..

[大山中学dp常练-4 Rounds]的更多相关文章

  1. 10-19 dp专练

    dp专练,终于克服了一次自己对dp的恐惧,磕出来一道题. 得分情况: T1:0 T2:0 T3:0 emmmm,磕出来的题是T2,但是因为初始化和int long long的原因爆零了 T1:n只狼排 ...

  2. 记502 dp专练

    趁着503的清早 我还算清醒把昨天老师讲的内容总结一下,昨天有点迷了 至使我A的几道题都迷迷糊糊的.(可能是我太菜了) 这道题显然是 数字三角形的变形 好没有经过认真思考然后直接暴力了 这是很不应该的 ...

  3. 数位dp小练

    最近刷题的同时还得填填坑,说来你们也不信,我还不会数位dp. 照例推几篇博客: 数位DP讲解 数位dp 的简单入门 这两篇博客讲的都很好,不过代码推荐记搜的形式,不仅易于理解,还短. 数位dp的式子一 ...

  4. dp专练

    dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...

  5. 【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534

    [树形dp]就是在树上做的一些dp之类的递推,由于一般须要递归处理.因此平庸情况的处理可能须要理清思路.昨晚開始切了4题,作为入门训练.题目都很easy.可是似乎做起来都还口以- hdu1520 An ...

  6. DP 专练

    A - 跳蚤电话 观察性质,可以发现每次连边的点一定是有祖先关系的,可以直接挂上去一个,也可以是在中间边上插入一个点. 所以我很自然的想到去计算树上的点的加入顺序,因为一但加入顺序确定,每一次的操作也 ...

  7. <python练习题>python练习题(常练勿忘)

    学了python,去面试经常出现,某个或某些库不熟悉导则想不起来怎么写,知道思路而写不出来,多半还是不够熟悉,这里就作为熟悉python的地方,多做做题,多思考. 题目1:店铺ID为00000000- ...

  8. 开坑数位dp

    [背景] 在10月3日的dp专练中,压轴的第6题是一道数位dp,于是各种懵逼. 为了填上这个留存已久的坑,蒟蒻chty只能开坑数位dp了. [例题一][HDU2089]不要62 题目大意:给你一个区间 ...

  9. 【HDU3507】Print Article(斜率优化DP)

    单调队列DP复出练手题 朴素方程dp[i]=min(dp[j]+(s[i]-s[j-1])^2+m 你懂得 ..]of int64; a,q:array[..]of longint; n,m,i,t, ...

随机推荐

  1. Redmine(Ruby)配置经验

    Redmine(Ruby)配置经验记录在配置Redmine邮件同步过程中遇到的各种问题与解决方法 1. 如何安装Redminehttp://www.redmine.org/projects/redmi ...

  2. Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作

    Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作 1.需求: 1.1)页面要美观大气 1.2)前端代码要简洁清晰,要用MVC或是MVVM框架 1. ...

  3. PHP中的表单提交和获取

    在php中表单提交的方式有两种: 1.post提交,这种安全性较高. 2.get提交,他提交的是一个url地址,因此在从地址上面就可以看到许多信息,因此不安全. 每个表单<form>后面都 ...

  4. JavaScript里的依赖注入

    JavaScript里的依赖注入 我喜欢引用这句话,“程序是对复杂性的管理”.计算机世界是一个巨大的抽象建筑群.我们简单的包装一些东西然后发布新工具,周而复始.现在思考下,你所使用的语言包括的一些内建 ...

  5. silverlight中datagrid数据到处excel

    首先新建一个DataGrdiExtensions类,代码为: public static class DataGridExtensions { /// <summary> /// 导出dg ...

  6. D6

    今天依旧很惨...本来第二题可以A的,感觉很久没有碰数学,出现这样的低级错误,简直逗了...晚上的话打算找了书店,静下心来看点书进去吧 但是其他题目就不太好写了..我直接发题解好了 T1:贪心 其实贪 ...

  7. Nginx反向代理实现Tomcat多个应用80端口访问

    应用背景 一般我们在开发时,一个工程里会有多个Web应用,比如一个前台一个后台,那我们就需要配置2个Tomcat服务器,比如一个是http://localhost:8080,一个是http://loc ...

  8. js操作iframe总结

    一 在父页面操作子页面   IE下操作IFrame内容的代码: document.frames["MyIFrame"].document.getElementById(" ...

  9. UML六种关系

    UML六种关系 基础之上,并对其进行了扩展.在程序中是通过继承类实现的.比如狗是对动物的具体描述,在面向对象设计的时候一般把狗设计为动物的子类. 表示方法:空心三角形箭头的实线,子类指向父类 实现 概 ...

  10. JavaScript原型与继承

    JavaScript原型与继承 原型 在JavaScript中,每个函数都有一个prototype属性,这个属性是一个指针,指向该函数的原型对象.这个原型对象为所有该实例所共享.在默认情况下,原型对象 ...