bzoj3640: JC的小苹果

Description

让我们继续JC和DZY的故事。

“你是我的小丫小苹果,怎么爱你都不嫌多!”

“点亮我生命的火,火火火火火!”

话说JC历经艰辛来到了城市B,但是由于他的疏忽DZY偷走了他的小苹果!没有小苹果怎么听歌!他发现邪恶的DZY把他的小苹果藏在了一个迷宫里。JC在经历了之前的战斗后他还剩下hp点血。开始JC在1号点,他的小苹果在N号点。DZY在一些点里放了怪兽。当JC每次遇到位置在i的怪兽时他会损失Ai点血。当JC的血小于等于0时他就会被自动弹出迷宫并且再也无法进入。

但是JC迷路了,他每次只能从当前所在点出发等概率的选择一条道路走。所有道路都是双向的,一共有m条,怪兽无法被杀死。现在JC想知道他找到他的小苹果的概率。

P.S.大家都知道这个系列是提高组模拟赛,所以这是一道送分题balabala

Input

第一行三个整数表示n,m,hp。接下来一行整数,第i个表示jc到第i个点要损失的血量。保证第1个和n个数为0。接下来m行每行两个整数a,b表示ab间有一条无向边。

Output

仅一行,表示JC找到他的小苹果的期望概率,保留八位小数。

将图按hp剩余量分层,用f[a][w]表示hp剩余a,当前在点w到达终点的概率

递推式只与当前层和hp更小的层有关,预处理对与当前层相关的部分构成的递推矩阵求逆,于是可以O(n^2)转移一层

时间复杂度O(n^3+n^2*hp)

#include<bits/stdc++.h>
typedef double ld;
int n,m,hp,vs[155];
std::vector<int>es[155];
ld f[10007][155],xs[155][155],ys[155],zs[155][155];
void ae(int a,int b){
    if(a==n)return;
    ++xs[a][a];
    if(vs[b])es[a].push_back(b);
    else --xs[a][b];
}
int main(){
    scanf("%d%d%d",&n,&m,&hp);
    for(int i=1;i<=n;++i)scanf("%d",vs+i),zs[i][i]=1;
    for(int i=0,a,b;i<m;++i){
        scanf("%d%d",&a,&b);
        ae(a,b);if(a!=b)ae(b,a);
    }
    xs[n][n]=1;
    for(int i=1;i<=n;++i){
        int w=i;
        for(int j=i+1;j<=n;++j)if(fabs(xs[j][i])>fabs(xs[w][i]))w=j;
        if(w!=i)
        for(int j=1;j<=n;++j){
            std::swap(xs[i][j],xs[w][j]);
            std::swap(zs[i][j],zs[w][j]);
        }
        ld a=xs[i][i];
        for(int j=1;j<=n;++j){
            xs[i][j]/=a;
            zs[i][j]/=a;
        }
        for(int j=1;j<=n;++j)if(j!=i){
            a=xs[j][i];
            for(int k=1;k<=n;++k){
                xs[j][k]-=xs[i][k]*a;
                zs[j][k]-=zs[i][k]*a;
            }
        }
    }
    for(int t=1;t<=hp;++t){
        for(int i=1;i<n;++i){
            ys[i]=0;
            for(int j=0;j<es[i].size();++j){
                int u=es[i][j];
                if(vs[u]<t)ys[i]+=f[t-vs[u]][u];
            }
        }
        ys[n]=1;
        for(int i=1;i<=n;++i){
            ld s=0;
            for(int j=1;j<=n;++j)s+=zs[i][j]*ys[j];
            f[t][i]=s;
        }
    }
    printf("%.8f\n",f[hp][1]);
    return 0;
}
时间: 2024-10-25 17:53:57

bzoj3640: JC的小苹果的相关文章

【BZOJ3640】JC的小苹果 概率DP+高斯消元

[BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但是由于他的疏忽DZY偷走了他的小苹果!没有小苹果怎么听歌!他发现邪恶的DZY把他的小苹果藏在了一个迷宫里.JC在经历了之前的战斗后他还剩下hp点血.开始JC在1号点,他的小苹果在N号点.DZY在一些点里放了怪兽.当JC每次遇到位置在i的怪兽时他会损失Ai点血.当JC的血小于等于0时他就会被自动弹出迷

BZOJ 3640 JC的小苹果(逆矩阵)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3640 题意:给出一个无向图,从1走到n.开始是血量H,从u到达v时血量减少a[v].每次走每条路径的概率相等.求走到n且血量大于0的概率. 思路:设f[h][u]表示到达u血量为h的概率.由于有的点到达时不掉血,这个不好弄.列出方程组,求出每个不掉血的点由哪些点到达以及他们的系数.比如x,y,z可到达r,r点不掉血,那么f[h][r]=p1*f[h][x]+p2*f[h][y]+

【复习】高斯消元解图上期望概率

复习了一下高斯消元解图上期望概率,笔记的话,就直接去看SengXian的blog吧.BZOJ 1444 - [Jsoi2009]有趣的游戏见https://blog.sengxian.com/solutions/bzoj-1444 #include <cstdio> #include <cstring> #include <algorithm> const int N=11; char s[N*2]; int n,m,l,cnt,trans[N*N][N],id[N*N

Win32 汇编 - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转);三.根据 EFLAGS 寄存器的标志位跳转, 这个太多了. 根据标志位跳转的指令: JE ;等于则跳转 JNE ;不等于则跳转 JZ ;为 0 则跳转 JNZ ;不为 0 则跳转 JS ;为负则跳转 JNS ;不为负则跳转 JC ;进位则跳转 JNC ;不进位则跳转 JO ;溢出则跳转 JNO ;不溢出则跳转 JA ;无符号大于则跳转 JNA

期待筷子兄弟“小苹果”的背后

最近火热的一首歌<小苹果>,相信大家都听到了.朗朗上口,只要听过几遍,都能唱出几段,还会下意识地跟着舞动起来.其实这首歌是加入了迪斯科舞曲元素,看看其在网络上的火热势头,估计很有可能成为新一代广场舞曲了. 相比于"江南staly",虽然这首歌有借鉴江南的地方,但我更喜欢这首"小苹果".可能是先入为主,我偏爱筷子兄弟.在我看来,他们的作品中除了逗人一笑,更有真诚的情感,不管是梦想还是亲情. 刚上大学时,一位选修课老师在课堂上放了他们的"老男孩&q

Assembly之instruction之JC

JC Jump if carry setJHS  Jump if higher or same Syntax JC label JHS label Operation If C = 1: PC + 2 × offset −> PC If C = 0: execute following instruction Description The status register carry bit (C) is tested. If it is set, the 10-bit signed offse

小苹果

小苹果作词:王太利作曲:王太利演唱:筷子兄弟编曲/制作人:赵佳霖吉他:张圣功伴唱:王馨悦 刘辉阳 王筱海 靳锐混音:江松松录音:王骏卓 我种下一颗种子终于长出了果实今天是个伟大日子摘下星星送给你拽下月亮送给你让太阳每天为你升起变成蜡烛燃烧自己 只为照亮你把我一切都献给你 只要你欢喜你让我每个明天都 变得有意义生命虽短爱你永远 不离不弃你是我的小呀小苹果儿怎么爱你都不嫌多红红的小脸儿温暖我的心窝点亮我生命的火 火火火火火火你是我的小呀小苹果儿就像天边最美的云朵春天又来到了花开满山坡种下希望就会收获

【BZOJ3316】JC loves Mkk 分数规划+单调队列

[BZOJ3316]JC loves Mkk Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来表示. Sample Input 5 3 4 3 1 2 4 5 Sample Output 7/2 HINT 1≤L≤R≤n≤10^5,0≤ai≤10^9,保证问题有解,数据随机生成 题解:直接二分答案,然后每个糖果的权值都变成a[i]-mid,我们需

mongodb replica set 添加/删除节点方法--http://www.ii123.com/jc/bc/bczh/258948.html

replica set多服务器主从,添加,删除节点,肯定会经常遇到的.下面详细说明一下,添加,删除节点的2种方法. 一,利用rs.reconfig,来添加,删除节点 1,添加节点  代码如下   repmore:PRIMARY> config = {_id:"repmore",members:[{_id:0,host:'127.0.0.1:27017',priority :2},{_id:1,host:'127.0.0.1:27018',priority:1}]};   //添加