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. [转载]John Burkardt搜集的FORTRAN源代码

    Over the years, I have collected, modified, adapted, adopted or created a number of software package ...

  2. win8 客户端源码

    博客园cnblogs for win8 托管到GitHub开源   中午研究了下GitHub ,然后把博客园cnblogs win8 客户端源码放到了上面. 源码网址是: https://github ...

  3. 使用Eclipse开始Java编程

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/start-java-programing ...

  4. iOS基础 - 瀑布流

    一.瀑布流简介 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pint ...

  5. python实现变参

    使用赋值表达式传递参数,可以颠倒参数列表的顺序.函数的参数提供默认参数 参数可以是变量,也可以是元祖.列表等内置的数据结构 在程序开发中,常常需要传递可变长度的参数.在函数的参数前使用标识符“*”可以 ...

  6. linq to NHibernate

      什么是linq to NHibernate 什么是linq to NHibernate?说简单一点就是linq + NHibernate. linq语句是.Net 3.5中新增的功能,从问世以来就 ...

  7. python读写protobuf

    0.     前期准备 官方protobuf定义 https://code.google.com/p/protobuf/   python使用指南 https://developers.google. ...

  8. 苹果icloud邮箱抓取

    1 icloud登录,与其他网站登录区别  1.1 支持pop抓取的邮箱:pop提供统一接口,抓取简单:  1.2 没有前端js加密的邮箱(139,126,163):只要代码正确模拟登录流程,参数正确 ...

  9. opencv中的vs框架中的Blob Tracking Tests的中文注释。

    经过2天的努力终于算是大概弄清楚了opencv中的vs框架是大概是如何工作的了,下面贴一下我自己写的代码注释.非常详细.对初学者有帮助.尤其详细分析了RunBlobTrackingAuto()函数,在 ...

  10. C++应用程序在Windows下的编译、链接(一)概述

    C++应用程序在Windows下的编译.链接(一)概述 本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 c ...