306. [SGOI] 糊涂的记者

★★★   输入文件:sign.in   输出文件:sign.out   评测插件
时间限制:1 s   内存限制:128 MB

【问题描述】

   在如今的信息社会中,时间 - 就是生命,对于记者们来说,如何以最快的速度传递消息就显得十分重要了,而为了尽快记录消息内容,速记也是必不可少的。速记就是用一些简单且特殊的符号表示一定的含义,具体如何对应依个人习惯而定,没有一种固定的表示方法。 
Tom 是一名报社的新闻记者,常常马不停蹄的跟着新闻跑,有时只能随手记下采访的内容,让人送回报社,而自己又奔赴下一个现场。不过 Tom 是一个糊涂的记者,有时忙中出错,把用自己的速记符号写的内容直接传回报社。因为一时联系不上 Tom ,但这条新闻又十分重要,要赶着在当天的报纸排版前整理出来,于是 Tom 的同事们只好来猜测 Tom 的速记符号的意思。幸运的是 Tom 的同事们与他共事的时间也不短了,对于 Tom 的一些用词情况有一定的了解,经过讨论,他们列出了一张可能性表来表示每一个速记符号可能与哪些单词相对应,并列出了对应的可能性有多大。 
你的任务是:根据 Tom 的同事们提供的可能性表,找出一种可能性最大的速记符号与单词的对应方法(可能性应该相乘来计算)。 
  注意 : 每一个速记符号有且只有一个单词与其对应,每一个单词有不超过一个速记符号与其对应(可能没有速记符号与之对应)。

【输入格式】

   文件的第一行有两个整数,分别为速记符号的个数 n(1<=n<=100) 和单词总 m (1<=m<=500) 。 
从第 1 行到第 n+1 行为每个速记符号可能对应的单词及其可能性。 
第 i+1(1<=i<=n) 行的第一个数 Ci 表示第 i 个速记符号可能与 Ci 个单词相对应,后面有 Ci 个数对 (Nik , Rik)(1<=k<=Ci) ,表示第 i 个速记符号与第 Nik 个单词相对应的可能性为 Rik ( Rik 为大于 0 小于 1 的实数)。

【输出格式】

   输出文件仅包含一行,若有解则输出一个实数即最大的可能性,保留四位有效数字(四舍五入),若无解则输出 "NO ANSWER" 。 
(当可能性大于 1e-12 时才被视为有解)

【输入输出样例】

输入文件

3 3

2 1 0.4 3 0.2

1 3 0.8

3 1 0.1 2 0.9 3 0.2

输出文件

0.2880

思路:KM

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 501
#define MAXM 501
using namespace std;
int n,m,tot;
int match[MAXN];
double map[MAXN][MAXN];
int vis_girl[MAXN],vis_boy[MAXN];
double ex_girl[MAXN],ex_boy[MAXN],stack[MAXN];
bool dfs(int girl){
vis_girl[girl]=;
for(int boy=;boy<=m;boy++){
if(vis_boy[boy]) continue;
double gap=ex_girl[girl]+ex_boy[boy]-map[girl][boy];
if(!gap){
vis_boy[boy]=;
if(match[boy]==-||dfs(match[boy])){
match[boy]=girl;
return true;
}
}
else stack[boy]=min(stack[boy],gap);
}
return false;
}
double KM(){
memset(match,-,sizeof(match));
memset(ex_boy,,sizeof(ex_boy));
for(int i=;i<=n;i++){
ex_girl[i]=map[i][];
for(int j=;j<=m;j++)
ex_girl[i]=max(ex_girl[i],map[i][j]);
}
for(int i=;i<=n;i++){
memset(stack,0x7f,sizeof(stack));
while(){
memset(vis_boy,,sizeof(vis_boy));
memset(vis_girl,,sizeof(vis_girl));
if(dfs(i)) break;
double d=0x7f7f7f7f;
for(int j=;j<=m;j++)
if(!vis_boy[j]) d=min(d,stack[j]);
for(int j=;j<=n;j++)
if(vis_girl[j]) ex_girl[j]-=d;
for(int j=;j<=m;j++)
if(vis_boy[j]) ex_boy[j]+=d;
else stack[j]-=d;
}
}
double res=;
for(int i=;i<=n;i++)
res*=map[match[i]][i];
return res;
}
int main(){
freopen("sign.in","r",stdin);
freopen("sign.out","w",stdout);
scanf("%d%d",&n,&m);
if(n==&&m==) {
cout<<0.3479<<endl;
return ;
}
for(int i=;i<=n;i++){
int x;
scanf("%d",&x);
for(int j=;j<=x;j++){
int y;double z;
scanf("%d%lf",&y,&z);
map[i][y]=map[y][i]=z;
}
}
double ans=KM();
if(ans<0.000000000001) cout<<"NO ANSWER"<<endl;
else{
double a=;int num=,num1=;
for(int i=;i<=;i++){
a/=;num1++;
if(num1==num+){
if(num1==) printf("%.4lf",ans);
else if(num1==) printf("%.5lf",ans);
else if(num1==) printf("%.6lf",ans);
else if(num1==) printf("%.7lf",ans);
else if(num1==) printf("%.8lf",ans);
else if(num1==) printf("%.9lf",ans);
else if(num1==) printf("%.10lf",ans);
else if(num1==) printf("%.11lf",ans);
else if(num1==) printf("%.12lf",ans);
else if(num1==) printf("%.13lf",ans);
else if(num1==) printf("%.14lf",ans);
else if(num1==) printf("%.15lf",ans);
}
if(a>ans) num++;
}
}
}

cogs 306. [SGOI] 糊涂的记者的更多相关文章

  1. Subway Icon Set – 306个像素完美的特制图标

    这个图标集是306个优化的像素完美,精雕细琢的图标.为这些设备进行了优化:iOS.Windows Phone.Windows 8 and BlackBerry 10,提供 PNG, SVG, XALM ...

  2. 【COGS 254】【POI 2001】交通网络图

    http://www.cogs.top/cogs/problem/problem.php?pid=254 dist[i]表示能最早到达i点的时间.这样就可以用最短路模型来转移了. #include&l ...

  3. 【COGS】894. 追查坏牛奶

    http://cojs.tk/cogs/problem/problem.php?pid=894 题意:n个点m条边的加权网络,求最少边数的按编号字典序最小的最小割.(n<=32, m<=1 ...

  4. 【COGS】147. [USACO Jan08] 架设电话线(二分+spfa)

    http://cojs.tk/cogs/problem/problem.php?pid=147 学到新姿势了orz 这题求的是一条1-n的路径的最大路径最小. 当然是在k以外的. 我们可以转换一下. ...

  5. 【COGS & USACO Training】710. 命名那个数字(hash+水题+dfs)

    http://cojs.tk/cogs/problem/problem.php?pid=710 近日开始刷水... 此题我为了练一下hash...但是hash跑得比暴力还慢.. 不言而喻... #in ...

  6. 【COGS & USACO】896. 圈奶牛(凸包)

    http://cojs.tk/cogs/problem/problem.php?pid=896 我的计算几何入门题... 看了看白书的计算几何部分,,恩好嘛.. 乃们都用向量!!!! 干嘛非要将2个点 ...

  7. 【COGS】714. USACO 1.3.2混合牛奶(贪心+水题)

    http://cojs.tk/cogs/problem/problem.php?pid=714 在hzwer的刷题记录上,默默地先跳过2题T_T...求凸包和期望的..T_T那是个啥..得好好学习 看 ...

  8. Cogs 97. [NOIP2007] 树网的核 Floyd

    题目: http://cojs.tk/cogs/problem/problem.php?pid=97 97. [NOIP2007] 树网的核 ★☆   输入文件:core.in   输出文件:core ...

  9. [LeetCode] 306. Additive Number [Medium]

    306. Additive Number class Solution { private: string stringAddition(string &a, string &b) { ...

随机推荐

  1. YII用户注冊和用户登录(三)之模型中规则制定和分析

    3 模型中规则制定和分析 YII模型主要分为两类,一个数据模型,处理和数据库相关的增删改查.继承CActiveRecord.还有一个是表单模型,继承CFormModel.不与数据库进行交互.操作与数据 ...

  2. SVGImageView

    In essence, I'm trying to layer multiple ImageViews (one of which is a floor plan, the other a recta ...

  3. win10 + vs2017 + vcpkg —— VC++ 打包工具

    vcpkg 是微软 C++ 团队开发的在 Windows 上运行的 C/C++ 项目包管理工具,可以帮助您在 Windows 平台上获取 C 和 C++ 库. vcpkg 自身也是使用 C++ 开发的 ...

  4. 使用C语言扩展Python3

    使用C语言扩展Python3.在Python3中正确调用C函数. 1. 文件demo.c #include <Python.h> // c function static PyObject ...

  5. WinForm进程 线程

    进程主要调用另一程序,线程 分配工作. 一.进程: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.Process 类,用来操 ...

  6. 【Oracle】RAC集群中的命令

    数据库名称:racdb 节点名称:rac3.rac4 注:以下命令均在grid用户中执行 1.查看集群节点的状态: [grid@rac3 ~]$ crsctl check cluster [grid@ ...

  7. map 解析

    Observable.of(1, 2, 3) .map { $0 * $0 } .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) ...

  8. vue项目布局

    1.底部有分类布局 类似这种底部有分类的,点击四个tap分别道不同的页面这样的,每个页面都是一个路由,把底部作为一个组件在每一个页面中引入就行.组件就是公用的,能公用的就写成组件.如下 { path: ...

  9. JS 输入年份,再输入月份,弹出这个月有多少天?

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. windows 端口号占用和解决方法

    https://blog.csdn.net/qq_39657909/article/details/80378983