题目链接

戳我

\(Solution\)

首先申明几个变量:

f[x]:到点x的概率,

vis[x]:x点的度

dp[x][y]:(x,y)这条边的概率

number[x][y]:x这条边的编号

下面的式子保证存在一条(x,y)的边

我们可以知道总分的期望为:

\[\sum dp[x][y]*number[x][y]
\]

即:所有边的期望成这条边的编号的和

那么\(dp\)数组怎么算呢?

\[dp[x][y]=\frac{f[x]}{vis[x]}+\frac{f[y]}{vis[y]}
\]

所以我们现在的任务就是求出\(f\)数组

再来看看\(f\)数组怎么求?

\[p[x]=\sum\frac{p[y]}{vis[y]}
\]

发现这个式子并不能简单的递推,因为存在环.

于是我们可以列方程接未知数

运用高斯消元就好了.

但是注意:

  • 如果有点和\(n\)相连,那么在计算期望时不需要算,因为到了点\(n\)时不会继续走下去了
  • 因为开始就在点\(1\),所以第一个方程的结果要设为\(1\)

解出方程后便可以将\(dp\)数组算出来了.

现在考虑原问题: "现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小"

我们可以进行贪心

将期望大的边使他编号小

\(Code\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
struct node{
int to,next;
}e[5000010];
int vis[5000010],head[10000001],n,m,cnt,X[1000001],Y[10000001];
void add(int x,int y){
e[++cnt].to=y,e[cnt].next=head[x],head[x]=cnt;
}
double a[5001][5001],f[1000001],ans=0;
void Gauss(){
n--,a[1][n+1]=-1;
for(int i=1; i<=n; i++) {
int bj=i;
for(int j=i+1; j<=n; j++)
if(fabs(a[j][i])>fabs(a[bj][i]))
bj=j;
for(int j=1; j<=n+1; j++)
swap(a[bj][j],a[i][j]);
if(!a[i][i])
continue;
double p=a[i][i];
for(int j=1;j<=n+1;j++)
a[i][j]/=p;
for(int j=1;j<=n;j++)
if(i!=j){
double o=a[j][i];
for(int k=1;k<=n+1;k++)
a[j][k]-=a[i][k]*o;
}
}
for(int i=n-1; i>=1; i--)
for(int j=i+1; j<=n; j++)
a[i][n+1]-=a[j][n+1]*a[i][j];
}
int main() {
n=read(),m=read();
for(int i=1;i<=m;i++)
X[i]=read(),Y[i]=read(),add(Y[i],X[i]),add(X[i],Y[i]),vis[X[i]]++,vis[Y[i]]++;
for(int i=1;i<n;i++){
a[i][i]=-1;
for(int j=head[i];j;j=e[j].next){
int v=e[j].to;
if(v!=n)
a[i][v]=1.0/vis[v];
}
}
Gauss();
for(int i=1; i<=m; i++){
if(X[i]!=n+1)
f[i]+=a[X[i]][n+1]/vis[X[i]];
if(Y[i]!=n+1)
f[i]+=a[Y[i]][n+1]/vis[Y[i]];
}
sort(f+1,f+1+m);
for(int i=1;i<=m;i++)
ans+=f[i]*(m-i+1);
printf("%0.3lf",ans);
return 0;
}

「HNOI 2013」游走的更多相关文章

  1. 「专题训练」游走(BZOJ-3143)

    题意与分析 定义走到每条边的期望为\(e_i\),一开始的想法是给定一个\(\large\sum_{i=1}^n e_i a_i\),求一个a的排列使得这个和最小.问题在于这样等于没对题目作分析,而且 ...

  2. 「HNOI 2013」比赛

    题目链接 戳我 \(Solution\) 这道题观察数据范围发现很小,再看看题目可以发现是搜索. 这题纯搜索会\(T\)所以要加入适当剪枝 如果一个人后面的比赛都赢却依旧到不了目标分数,则直接\(re ...

  3. 「HNOI 2013」消毒

    题目链接 戳我 \(Solution\) 我们首先想一想如果这一题只是二维的该怎么办? 就是一个最小点覆盖问题.这里就不详细解释了,用网络流或匈牙利都无所谓. 但现在是三维的,那么现在该如何处理呢? ...

  4. 「HNOI 2013」数列

    题目链接 戳我 \(Solution\) 这道题貌似并不难的样子\(QAQ\) 我们发现这个因为有首项的关系所以有点不太好弄.所以我们要将这个首项对答案的影响给去掉. 我们可以构建一个差分数组,我们令 ...

  5. 「HNOI2013」游走

    「HNOI2013」游走 题目描述 一个无向连通图,顶点从 \(1\) 编号到 \(N\) ,边从 \(1\) 编号到 \(M\) .小 \(Z\) 在该图上进行随机游走,初始时小 \(Z\) 在 \ ...

  6. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  7. 「HNOI/AHOI2018」道路

    传送门 Luogu 解题思路 考虑树形 \(\text{DP}\) 设状态 \(dp[u][i][j]\) 表示从首都走到点 \(u\) ,经过 \(i\) 条公路,\(j\) 条铁路的最小不方便值. ...

  8. Solution -「HNOI 2007」「洛谷 P3185」分裂游戏

    \(\mathcal{Description}\)   Link.   给定 \(n\) 堆石子,数量为 \(\{a_n\}\),双人博弈,每轮操作选定 \(i<j\le k\),使 \(a_i ...

  9. 「HNOI 2019」白兔之舞

    一道清真的数论题 LOJ #3058 Luogu P5293 题解 考虑$ n=1$的时候怎么做 设$ s$为转移的方案数 设答案多项式为$\sum\limits_{i=0}^L (sx)^i\bin ...

随机推荐

  1. Mysql 5.6 源码编译安装

    简介: 多余的话不说,就是源码安装 Mysql 5.6 ,机器内存 512 MB ,系统 CentOS 6.6 ,安装方式 minimal ! 1.安装底层支持包 shell > yum -y ...

  2. 关于junit包导入不了但是maven本地库中却存在的问题

    导入项目的时候发现junit的类使用不了,于是就去看看包导入了没有 发现包是灰色的,于是猜想可能是maven本地库中包没下载过来 查询了本地库发现包是存在的,这就奇怪的,经过网上查询之后得到解决方案 ...

  3. Differences Between 3 Types Of Proxy Servers: Normal, Transparent And Reverse Proxy

    What is a Proxy Server? A Proxy server is an intermediary machine, between a client and the actual s ...

  4. Spark会产生shuffle的算子

    去重 def distinct() def distinct(numPartitions: Int) 聚合 def reduceByKey(func: (V, V) => V, numParti ...

  5. 关于《Spark快速大数据分析》运行例子遇到的报错及解决

    一.描述 在书中第二章,有一个例子,构建完之后,运行: ${SPARK_HOME}/bin/spark-submit --class com.oreilly.learningsparkexamples ...

  6. Maven详解【面试+工作】 各种安装 没用

    1 Maven介绍1.1 项目开发中遇到的问题 1.都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 2.为什么在我的机器上可以正常打包,而配置管理员却打不出来? 3.项目组加入 ...

  7. Python3 获取RDS slowlog+微信接口报警

    一.功能说明 二.代码详情 1.通过阿里sdk获取慢查询列表,格式化. 2.企业微信报警接口 3.deamon #!/usr/bin/python #-*- conding:utf-8 -*- fro ...

  8. 循环结构之for循环

    循环结构之for循环(一) 在很多编程语言中都有一种直接.简单的循环,它的一般形式为: 它的执行过程如下: 第一步:执行表达式1,对循环变量做初始化: 第二步:判断表达式2,若其值为真(非0),则执行 ...

  9. TensorFlow全新的数据读取方式:Dataset API入门教程

    TensorFlow.data : http://tech.ifeng.com/a/20171109/44752505_0.shtml Pytorch:https://ptorch.com/docs/ ...

  10. 谈谈Spring 注入properties文件总结

    本篇谈谈Spring 注入properties文件总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 spring提供了多种方式来注入properties文件,本文做一个 ...