[noip2005提高]过河 dp

由于L的范围到了109,用普通dp做肯定是不成了;

可以观察到M的数量很小,dp在转移的过程中有大量的无用转移;

可以想到压缩范围,问题是如何压缩,观察若S=9,T=10时,能到达的点,9,10,18,19,20,27,28,29,30,36,37,38,39,40....80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120...

观察到了一定限度以后,可以跳到任意一个点;

所以可以根据这个压缩,压缩到100就可以了;

有一个地方需要注意,若S=T,要特判,不能压缩;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iomanip>
 7 #include<cstdlib>
 8 using namespace std;
 9 const int maxn=110,maxm=20000;
10 int L,S,T,M,N;
11 int a[maxn];
12 int vis[maxm],f[maxm];
13 void init(){
14     scanf("%d%d%d%d",&L,&S,&T,&M);
15     for(int i=1;i<=M;i++)scanf("%d",&a[i]);
16     sort(a+1,a+M+1);
17 }
18 void work(){
19     int last=0;
20     for(int i=1;i<=M;i++){
21         if(a[i]-a[i-1]>100){vis[last+=100]=1;}
22         else {vis[last+=a[i]-a[i-1]]=1;}
23     }
24     if(S==T){
25         int sum=0;
26         for(int i=1;i<=M;i++)if(a[i]%S==0)sum++;
27         cout<<sum<<endl;
28         return;
29     }
30     N=last;
31     memset(f,127,sizeof(f));
32     f[0]=0;
33     for(int i=0;i<=N+10;i++){
34         for(int j=S;j<=T;j++)f[i+j]=min(f[i+j],f[i]+vis[i+j]);
35     }
36     int minn=(1<<30);
37     for(int i=N+1;i<=N+10;i++)minn=min(minn,f[i]);
38     cout<<minn<<endl;
39 }
40 int main(){
41     freopen("1.in","r",stdin);
42     freopen("1.out","w",stdout);
43     init();
44     work();
45 }

时间: 2025-01-31 00:34:41

[noip2005提高]过河 dp的相关文章

【水】NOIP2005提高组 谁拿了最多的奖学金

PID16 / 谁拿了最多奖学金 类型:模拟 来源 NOIP2005提高组 题目描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得: 2) 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得: 3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)

NOIP2005提高组 &amp;&amp; HLG 1219 谁拿了最多奖学金 (好经典的基础题 )

链接: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1219 Description 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得: 2) 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成

NOIP2005过河[DP 状态压缩]

题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥. 题目给出独木桥的长度L,青蛙跳跃的距离

【洛谷P1052【NOIP2005提高T2】】过河

题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,--,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥. 题目给出独木桥的长度L,青蛙跳跃的距离

[NOIP2005提高组]过河

题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,--,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥. 题目给出独木桥的长度L,青蛙跳跃的距离

vijos p1002——过河(noip2005提高组T2)

描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥. 题目给出独木桥的长度L,青蛙跳跃的距离范围

欧几里得算法以及扩展欧几里得算法(过河noip2005提高组第二题)

欧几里得算法:也被称作辗转相除法 gcd(a,b)=gcd(b,a%b); 终止条件a=gcd b=0; (gcd为a,b的最大公约数) 扩展欧几里得算法: a 和 b 的最大公约数是 gcd ,一定能够找到这样的 x 和 y ,使得: a*x + b*y = gcd 成立 我们只需要找到特殊解x0,y0; 则通解为 x = x0 + (b/gcd)*t    y = y0 – (a/gcd)*t 那如何求出下一组解呢 仿照欧几里得算法a=b,b=a%b代入. a%b = a - (a/b)*b

【NOIP2005】过河

Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥.题目给出独木桥的长度L,青

noip2005提高组题解

T1.谁拿了最多的奖学金 给出n个学生的信息,分别表示:姓名,期末成绩,班级评议成绩,是否学生干部(Y/N),是否西部学生(Y/N),论文数: 奖学金分为: 1).院士奖学金,每人8000 元,期末平均成绩高于80 分(>80),并且在本学期内发表1 篇或1 篇以上论文的学生均可获得: 2).五四奖学金,每人4000 元,期末平均成绩高于85 分(>85),并且班级评议成绩高于80 分 (>80)的学生均可获得: 3).成绩优秀奖,每人2000 元,期末平均成绩高于90 分(>90