Description

我们看见了一个由 m 行 n 列的 1*1 的格子组成的矩阵,每个格子(I,j)有对应的高度 h[i][j]和初始的一个非负权值 v[i][j].我们可以随便选择一个格子作为起点,然后在接下来的每一步当中,我们能且只能到达与当前格子有边相邻的四个格子中的高度不超过当前格子高度的格子,每当我们到达一个新格子(包括一开始选择的初始格子),我们就能得到该格子的权值分,然后该格子的权值就会等概率变成不比当前的权值大的一个非负权值。每一个格子在满足前面条件情况下,可以走任意多次。我们希望得到一个最大的期望权值和路径,并给出这个最大的期望权值和。

Input
第一行两个正整数表示 m,n。
接下来的 m 行,每行 n 个正整数,表示 h[i][j].
接下来的 m 行,每行 n 个非负整数,表示 v[i][j].

Output
一行一个实数,表示所求的最大期望权值和。保留零位小数。

Sample Input
1 3
1 2 1
1 2 3

Sample Output
5

Data Range
对于 30%的数据,保证 n,m 不超过 100.
对于另外 20%的数据,保证不存在相同的高度的格子。
对于 100%的数据,保证 n,m 不超过 1000.所有权值与高度不超过 10^9.

Solution

对于高度相同的点可以重复来回走,把他们整体看成一个点,权值为v,每走完一次,他的权值变成[0,v]内的一个值的概率一样,那么期望的平均值为0.5v。每走一次,v'=0.5v,那么看成一个等比数列{vi},其中v1=v,vi=0.5vi-1,那么记等差数列前i项和为Si,当i→+∞时,Si→2v(形象理解:一个饼每次切1/2,最后切到无限小;严谨推理:等比数列求和公式,在次不做赘述)

那么对于相同高度的点,缩成一个点,如果缩点前的点数>1,最后权值×2,最后对于每个缩的点跑一边最长路即可(SPFA/DP)

要注意缩点BFS的写法,不要队列弹出时再记录,加入队列前就记录,否则可能会WA

Code

 1 #include<set>
 2 #include<map>
 3 #include<queue>
 4 #include<stack>
 5 #include<cstdio>
 6 #include<cstring>
 7 #include<iostream>
 8 #include<algorithm>
 9 #define inf (1<<30)
10 #define ll long long
11 #define RG register int
12 #define rep(i,a,b)    for(RG i=a;i<=b;i++)
13 #define per(i,a,b)    for(RG i=a;i>=b;i--)
14 #define maxn 1005
15 #define add(x,y) e[++cnt].v=y,e[cnt].next=head[x],head[x]=cnt
16 using namespace std;
17 typedef pair<int,int> pir;
18 int n,m,id,cnt;
19 int h[maxn][maxn],val[maxn][maxn],head[maxn*maxn];
20 int rec[maxn][maxn];
21 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
22 ll ans,V[maxn*maxn],f[maxn*maxn];
23 struct E{
24     int v,next;
25 }e[4000005];
26 inline int read()
27 {
28     int x=0,f=1;char c=getchar();
29     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
30     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
31     return x*f;
32 }
33
34 void DO(int x,int y)
35 {
36     ++id;int num=0;
37     queue<pir> que;
38     que.push((pir){x,y});
39     pir u;int tx,ty;
40     while(!que.empty())
41     {
42         u=que.front();que.pop(),++num;
43         rec[u.first][u.second]=id,V[id]+=val[u.first][u.second];
44         rep(i,0,3)
45         {
46             tx=u.first+dir[i][0],ty=u.second+dir[i][1];
47             if(tx<1||tx>n||ty<1||ty>m)    continue;
48             if(rec[tx][ty])                continue;
49             if(h[tx][ty]!=h[u.first][u.second])    continue;
50             que.push((pir){tx,ty});
51         }
52     }
53     if(num>1)    V[id]<<=1;
54 }
55
56 ll LongPath(int u)
57 {
58     if(f[u]!=-1)    return f[u];
59     f[u]=0;
60     for(int i=head[u];i;i=e[i].next)
61     {
62         f[u]=max(f[u],LongPath(e[i].v));
63     }
64     f[u]+=V[u];
65     return f[u];
66 }
67
68 int main()
69 {
70     freopen("road.in","r",stdin);
71     freopen("road.out","w",stdout);
72     n=read(),m=read();
73     rep(i,1,n)rep(j,1,m)    h[i][j]=read();
74     rep(i,1,n)rep(j,1,m)    val[i][j]=read();
75     rep(i,1,n)rep(j,1,m)    if(!rec[i][j])    DO(i,j);
76     int tx,ty;
77     rep(x,1,n)rep(y,1,m)rep(i,0,3)
78     {
79         tx=x+dir[i][0],ty=y+dir[i][1];
80         if(tx<1||tx>n||ty<1||ty>m||h[tx][ty]>=h[x][y])    continue;
81         add(rec[x][y],rec[tx][ty]);
82     }
83     memset(f,-1,sizeof(f));
84     rep(i,1,id) ans=max(ans,LongPath(i));
85     cout<<ans;
86     return 0;
87 }

View Code

转载于:https://www.cnblogs.com/ibilllee/p/7798404.html

道路 [NOIP模拟]相关推荐

  1. 闵梓轩大佬のnoip模拟题D1 总结 2017/10/26

    背景 题目概括 T1 题面 分析 90分算法 满分算法 T2 题面 分析 部分分算法 满分算法 满分代码 T3 题面 分析 代码 总结 背景 这道题目是去年的金牌大佬闵梓轩在一年前出的一套noip模拟 ...

  2. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  3. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  4. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  5. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  6. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  7. NOIP模拟(10.22)T2 杆子的排列

    杆子的排列 题目背景: 10.22 NOIP模拟作业T2 分析:DP 定义状态dp[i][j][k]表示,目前枚举到第i大的数(即n - i + 1)那么显然如果这一个数放在左边,可以在左边被看到,放 ...

  8. 元胞自动机的道路交通模拟

    元胞自动机的道路交通模拟 1.直行单行道--概率P进入研究区域道路交通模拟 元胞自动机原理: 直行单行道代码模拟: 2.直行交叉口(含红绿灯)--概率P进入研究区域道路交通模拟 交叉口原理: 交叉口代 ...

  9. Noip 模拟练习5

    Noip 模拟练习5 满分300,本人240.修正后300. 难度中等. 太空密码 Description 人类一直致力于探索地外文明,为此科学家们建造了一个巨大的射电望远镜 用于接收宇宙射线.一天从 ...

最新文章

  1. 悲催的IE6,悲催的壳浏览器,悲催的搜狗,悲催的360
  2. pythontuple数据类型_Python数据类型之元组的详细介绍
  3. pycharm 如何使用git链接到github实现代码提交
  4. 有些时候,我们以为对的意见,往往在行家看来是比较幼稚之亲身经历
  5. 怎么删除结构体数组中的一组数据_数据结构-栈
  6. 经典C语言程序100例之七二
  7. 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型
  8. hadoop(3)——yarn查看方式
  9. MATLAB符号运算(3)
  10. ATOM使用的一点心得与技巧——在一个窗口打开多个项目
  11. 香港理工大学ASSIST2011会议(2011-09-30)
  12. JMeter使用实践之造数据
  13. cadence如何导入gds_Tanner LEdit系列 | 导入GDSII文件
  14. 苹果隐藏应用_AppStore今日推荐 资源丰富无限制的隐藏观影应用
  15. 利用好 git bisect 这把利器,帮助你快速定位疑难 Bug
  16. 【MATLAB】求不定积分
  17. easypermission坑_Android 权限管理(原生、EasyPermissions、RxPermissions)-阿里云开发者社区...
  18. 管理学中的 Expectancy Theory - 期望理论
  19. oracle写excel文件,ORACLE-将oracle数据库中数据写入excel文件
  20. [源码和文档分享]VC++实现的基于人眼状态的疲劳驾驶识别系统

热门文章

  1. 在angularjs实现一个时钟
  2. 吐槽知乎现任搜索引擎
  3. Cocos2d 之FlyBird开发---GameData类
  4. 【学习笔记】【oc】类和对象及类的三大基本特征
  5. 对RTMP视频流进行BitmapData.draw()出错的解决办法
  6. jeasyui控件事件和方法的使用方法
  7. 网站常见攻击与防御汇总
  8. asp.net 学习的一些地址
  9. 根据MATLAB的histeq函数改写的运行在OpenCV下的直方图规定化C源码
  10. VC的包含文件和引用文件是不一样的~