【2016-09-27-DP小练】

得分250。。我真是个250。。。

犯了一些很搞笑的错。。

f[i][j][k]表示第i个苹果,现在在j这个位置,还能用k次转移。

用i去更新i+1。

时间复杂度1000*2*30;

转移方程有个地方减一写错位了。。这么明显的错竟然没有看见。。50分TAT

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6
 7 const int N=1100,M=50;
 8 int n,K,f[N][3][M],t[N];
 9
10 int maxx(int x,int y){return x>y ? x:y;}
11 void g(int &x,int y){x=maxx(x,y);}
12
13 int main()
14 {
15     // freopen("a.in","r",stdin);
16     freopen("bcatch.in","r",stdin);
17     freopen("bcatch.out","w",stdout);
18     scanf("%d%d",&n,&K);
19     for(int i=1;i<=n;i++) scanf("%d",&t[i]),t[i]--;
20     memset(f,-63,sizeof(f));
21     f[0][0][K]=0;
22     for(int i=0;i<n;i++)
23     {
24         int now=t[i+1];
25         for(int k=0;k<=K;k++)
26         {
27             g(f[i+1][now][k],f[i][now][k]+1);
28             if(k>=1) g(f[i+1][now][k-1],f[i][1-now][k]+1);
29             g(f[i+1][1-now][k],f[i][1-now][k]);
30             if(k>=1) g(f[i+1][1-now][k-1],f[i][1-now][k]);
31         }
32     }
33     int ans=0;
34     for(int k=0;k<=K;k++) ans=maxx(ans,maxx(f[n][0][k],f[n][1][k]));
35     printf("%d\n",ans);
36     return 0;
37 }

T1

f[i][j]表示当前时间为i,能力值为j时的最大滑雪次数。

预处理:给课程先排一次序;p[i]表示能力值为i时滑一次雪最少要多久。

然后就是要不去上课;要不去滑雪。

时间复杂度10^4*100。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7
 8 const int N=100010;
 9 struct node{
10     int c,d;
11 }a[N];
12 struct nod{
13     int m,l,A;
14 }b[N];
15 int n,s,t,p[N],f[11000][110],mx[N];
16
17 // bool cmp1(node x,node y)
18 // {
19     // if(x.c==y.c) return x.d<y.d;
20     // return x.c<y.c;
21 // }
22
23 bool cmp2(nod x,nod y){return x.m<y.m;}
24 int maxx(int x,int y){return x>y ? x:y;}
25 int minn(int x,int y){return x<y ? x:y;}
26 void g(int &x,int y){x=maxx(x,y);}
27
28 int main()
29 {
30     // freopen("a.in","r",stdin);
31     freopen("ski.in","r",stdin);
32     freopen("ski.out","w",stdout);
33     scanf("%d%d%d",&t,&s,&n);
34     memset(p,63,sizeof(p));
35     for(int i=1;i<=s;i++)
36     {
37         scanf("%d%d%d",&b[i].m,&b[i].l,&b[i].A);
38     }
39     for(int i=1;i<=n;i++)
40     {
41         scanf("%d%d",&a[i].c,&a[i].d);
42         p[a[i].c]=minn(p[a[i].c],a[i].d);
43     }
44     for(int i=1;i<=100;i++) p[i]=minn(p[i],p[i-1]);
45     // sort(a+1,a+1+n,cmp1);
46     sort(b+1,b+1+s,cmp2);
47     b[s+1].m=0;
48     int ind=1,ans=0;
49     memset(f,-63,sizeof(f));
50     memset(mx,-63,sizeof(mx));
51     f[0][1]=0;
52     for(int i=0;i<=t;i++)
53         for(int j=1;j<=100;j++)
54         {
55             g(f[i][j],mx[j]);
56             while(b[ind].m<i && ind<=s) ind++;
57             if(b[ind].m==i) g(f[i+b[ind].l][b[ind].A],f[i][j]);
58             g(f[i+p[j]][j],f[i][j]+1);
59             g(mx[j],f[i][j]);
60             if(i==t) ans=maxx(ans,f[i][j]);
61         }
62     printf("%d\n",ans);
63     return 0;
64 }

T2

这题是我被卡住的一题。。因为我一直在想它为了达到后面的限制,前面可能要特意往下走一点。。

一出来发现自己好搞笑。。

首先我们从后往前预处理一遍,s[i]=minn(s[i],s[i+1]+dis(i~i+1)),这样就保证了满足当前的限制,以后的限制就一定有办法达到!

然后就是一个贪心了。

对于当前的v,下一个限制s[i+1],它们之间的速度差k=s[i+1]-v,距离d=dis(i~i+1)

设加速x秒,减速y秒。

x+y=d

x - y=k

所以最高速度x=(d+k)/2;

ans取max。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7
 8 const int N=110000;
 9 int l,n,pl,t[N],s[N];
10 struct node{
11     int t,s;
12 }a[N];
13
14 bool cmp(node x,node y){return x.t<y.t;}
15 int maxx(int x,int y){return x>y ? x:y;}
16 int minn(int x,int y){return x<y ? x:y;}
17
18 int main()
19 {
20     // freopen("a.in","r",stdin);
21     freopen("bobsled.in","r",stdin);
22     freopen("bobsled.out","w",stdout);
23     scanf("%d%d",&l,&n);
24     pl=0;t[0]=0;
25     for(int i=1;i<=n;i++) scanf("%d%d",&a[i].t,&a[i].s);
26     sort(a+1,a+1+n,cmp);
27     for(int i=n;i>=1;i--)
28     {
29         int d=a[i].t-a[i-1].t;
30         a[i-1].s=minn(a[i-1].s,a[i].s+d);
31     }
32     int v=1,ans=0;
33     for(int i=1;i<=n;i++)
34     {
35         int d=a[i].t-a[i-1].t;
36         if(v+d<=a[i].s) v=v+d,ans=maxx(ans,v);
37         else
38         {
39             int k=a[i].s-v;
40             ans=maxx(ans,v+(d+k)/2);
41             v=a[i].s;
42         }
43         // printf("v = %d\n",v);
44     }
45     ans=maxx(ans,v+l-a[n].t);
46     printf("%d\n",ans);
47     return 0;
48 }

T3

f[i][j]表示当前扫到第i只奶牛,余数是j。

转移方程就直接看把。。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7
 8 const int N=2100,M=1100,Mod=(int)1e8;
 9 int n,m,f[N][M],a[N];
10
11 int maxx(int x,int y){return x>y ? x:y;}
12 void g(int &x,int y){x=(x+y)%Mod;}
13
14 int main()
15 {
16     // freopen("a.in","r",stdin);
17     freopen("fristeam.in","r",stdin);
18     freopen("fristeam.out","w",stdout);
19     scanf("%d%d",&n,&m);
20     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
21     memset(f,0,sizeof(f));
22     f[0][0]=1;
23     for(int i=0;i<=n;i++)
24     {
25         for(int j=0;j<=m;j++)
26         {
27             g(f[i+1][(j+a[i+1])%m],f[i][j]);
28             g(f[i+1][j],f[i][j]);
29             // printf("f [ %d ] [ %d ] = %d\n",i,j,f[i][j]);
30         }
31     }
32     printf("%d\n",f[n][0]-1);
33     return 0;
34 }

T4

时间: 2024-11-03 05:38:21

【2016-09-27-DP小练】的相关文章

【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534

[树形dp]就是在树上做的一些dp之类的递推,因为一般需要递归处理,因此平凡情况的处理可能需要理清思路.昨晚开始切了4题,作为入门训练.题目都非常简单,但是似乎做起来都还口以- hdu1520 Anniversary party 给一颗关系树,各点有权值,选一些点出来.任一对直接相连的边连接的点不能同时选择,问选择出的权值和最大为多少. 考虑以u为根的子树可以选择的方法,dp[u]表示选择u时能获得最大收益,dp2[u]表示不选u时能获得的最大收益.则u不选时,为dp2[u]=max{dp[v]

数位dp小练

最近刷题的同时还得填填坑,说来你们也不信,我还不会数位dp. 照例推几篇博客: 数位DP讲解 数位dp 的简单入门 这两篇博客讲的都很好,不过代码推荐记搜的形式,不仅易于理解,还短. 数位dp的式子一般是这样的:dp[i][][]表示到第\(i\)位,而后面几维就因题而异了. 不过通用的思想就是利用前缀相减求出区间信息. 算了上题吧. [SCOI2009]windy数 这都说是数位dp入门题. 根据这题,受到影响的数只有相邻两个,因此dp[i][j]表示到第\(i\)位(从高往低)上一位的数\(

2016/09/27 Hadoop Yarn

1.1 YARN基本架构     YARN是Hadoop2.0中的资源管理系统,它的基本设计思想是将MRv1中的JobTracker拆分成了两个独立的服务:一个全局的资源管理器ResourceManager和每个应用程序特有的ApplicationMaster.其中ResourceManager负责整个系统的资源管理和分配,而ApplicationMaster负责单个应用程序的管理. 1.2 YARN基本组成结构     YARN总体上仍然是Master/Slave结构,在这个资源管理框架中,R

【英语学习】2016.09.11 Culture Insider: Teacher&#39;s Day in ancient China

Culture Insider: Teacher's Day in ancient China 2016-09-10 CHINADAILY Today is the 32nd Chinese Teacher's Day – a festival celebrating the 2,300-year tradition of respecting teachers and education in China. It's similar to the birthday of Confucius o

2016.09.21 公司裁员想到的

公司最近裁员,好多同事都走了. 想到了,不管在那里都要努力工作,成为该领域的专家,才能立于不败之地. 得之何喜,失之何忧. 加油,最好自己,无愧我心. 不断进步,不断上升 2016.09.21 晚 于北京朝阳

3.12课程小练以及vim编辑器的基本用法(部分)

 课程小练 1. 通过man帮助手册,自行总结which.whereis.whatis命令的使用方法: which:展示出shell命令的完整路径: 格式: which [options] [--] programname [...] whereis:基于二进制的,有源的,和文件或命令的记录手册 格式:whereis [options] name... whatis:在 whatis 数据库里查找完整的单词 格式:whatis - 2. du命令: du - 报告磁盘空间使用情况 du -a,

2016年中国微信小程序专题研究报告

2016年12月29日,全球领先的移动互联网第三方数据挖掘和分析机构iiMedia Research(艾媒咨询)权威首发<2016年中国微信小程序专题研究报告>. 报告显示,82.6%手机应用开发者已经开始关注小程序.21.8%手机应用开发者明确表示愿意接入小程序,53.9%开发者正在持观望状态,24.3%开发者则暂时没有考虑接入小程序. 以下为报告详细内容: 艾媒咨询分析师认为,小程序作为一种新型手机服务方式,将对人类生活各方面造成一定程度影响,移动端服务消费将为用户提供更大的便利性,更会对

static2014年6月9日09:27:29

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Static再谈 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 A a = new A(); 14 a.Hello();//实例对

Algs4-2.3.27忽略小数组

2.3.27忽略小数组.用实验对比以下处理小数组的方法和练习2.3.25的处理方法的效果:在快速排序中直接忽略小数组,仅在快速排序结束后运行一次插入排序.注意:可以通过这些实验估计出电脑的缓存大小,因为当数组大小超出缓存时这种方法的性能可能会下降.public class E2d3d27{    public static void sort1(Comparable[] a,int M)    {      //StdRandom.shuffle(a);      sort1(a,0,a.len

算法小练#1 - Dany Yang

开始记录每周做过的算法题,这是第一周,新的开始 1021. 删除最外层的括号 题目要求如下: 有效括号字符串为空 ("")."(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接.例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串. 如果有效字符串 S 非空,且不存在将其拆分为 S