4819: [Sdoi2017]新生舞会

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 601  Solved: 313

Description

学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴。有n个男生和n个女生参加舞会
买一个男生和一个女生一起跳舞,互为舞伴。Cathy收集了这些同学之间的关系,比如两个人之前认识没计算得出 
a[i][j] ,表示第i个男生和第j个女生一起跳舞时他们的喜悦程度。Cathy还需要考虑两个人一起跳舞是否方便,
比如身高体重差别会不会太大,计算得出 b[i][j],表示第i个男生和第j个女生一起跳舞时的不协调程度。当然,
还需要考虑很多其他问题。Cathy想先用一个程序通过a[i][j]和b[i][j]求出一种方案,再手动对方案进行微调。C
athy找到你,希望你帮她写那个程序。一个方案中有n对舞伴,假设没对舞伴的喜悦程度分别是a'1,a'2,...,a'n,
假设每对舞伴的不协调程度分别是b'1,b'2,...,b'n。令
C=(a'1+a'2+...+a'n)/(b'1+b'2+...+b'n),Cathy希望C值最大。

Input

第一行一个整数n。
接下来n行,每行n个整数,第i行第j个数表示a[i][j]。
接下来n行,每行n个整数,第i行第j个数表示b[i][j]。
1<=n<=100,1<=a[i][j],b[i][j]<=10^4

Output

一行一个数,表示C的最大值。四舍五入保留6位小数,选手输出的小数需要与标准输出相等

Sample Input

3
19 17 16
25 24 23
35 36 31
9 5 6
3 4 2
7 8 9

Sample Output

5.357143

HINT

Source

鸣谢infinityedge上传

【分析】

  好吧费用流竟然给过。。。

  但是我打KM。。。算练一练吧。。。还是打错了两个地方【要记住下次不要错了啊!!!

  就是经典的0-1分数规划

  二分答案mid

  则$\sum a[i][j]-mid*b[i][j]>=0$,这个用KM做最大费用判断是否大于等于0即可。

  然后精度要弄小一点才不会被卡,弄到了1e-10,然后狂T是因为INF不够大,晕。。。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<cmath>
 7 using namespace std;
 8 #define Maxn 110
 9 const double eps=1e-10;
10 const double INF=1e12;
11
12 double a[Maxn][Maxn],b[Maxn][Maxn];
13
14 int visx[Maxn],visy[Maxn],match[Maxn];
15 double slack[Maxn],lx[Maxn],ly[Maxn];
16 int n;
17
18 bool ffind(double mid,int x,int nt)
19 {
20     visx[x]=nt;
21     for(int y=1;y<=n;y++) if(visy[y]!=nt)
22     {
23         if(fabs(lx[x]+ly[y]-(a[x][y]-mid*b[x][y]))<eps)
24         {
25             visy[y]=nt;
26             if(!match[y]||ffind(mid,match[y],nt))
27             {
28                 match[y]=x;
29                 return 1;
30             }
31         }
32         else slack[y]=min(slack[y],lx[x]+ly[y]-(a[x][y]-mid*b[x][y]));
33     }
34     return 0;
35 }
36
37 bool check(double mid)
38 {
39     for(int i=1;i<=n;i++) match[i]=0;
40     for(int i=1;i<=n;i++)
41     {
42         visx[i]=visy[i]=0;
43         lx[i]=-INF;ly[i]=0;
44         for(int j=1;j<=n;j++) lx[i]=max(lx[i],a[i][j]-mid*b[i][j]);
45     }int nt=0;
46     for(int i=1;i<=n;i++)
47     {
48         for(int j=1;j<=n;j++) slack[j]=INF;
49         while(1)
50         {
51             nt++;
52             if(ffind(mid,i,nt)) break;
53             double delta=INF;
54             for(int j=1;j<=n;j++) if(visy[j]!=nt) delta=min(delta,slack[j]);
55             for(int j=1;j<=n;j++)
56             {
57                 if(visx[j]==nt) lx[j]-=delta;
58                 if(visy[j]==nt) ly[j]+=delta;
59                 else if(fabs(INF-slack[j])<eps) slack[j]-=delta;
60             }
61         }
62     }
63     double ans=0;
64     for(int i=1;i<=n;i++) ans+=lx[i]+ly[i];
65     return ans>=0;
66 }
67
68 int main()
69 {
70     double l=0,r=0;
71     scanf("%d",&n);
72     for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]),r+=a[i][j];
73     for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lf",&b[i][j]);
74     while(r-l>eps)
75     {
76         double mid=(l+r)/2;
77         if(check(mid)) l=mid;
78         else r=mid;
79     }
80     printf("%.6lf\n",l);
81     return 0;
82 }

View Code

2017-04-28 13:21:57

转载于:https://www.cnblogs.com/Konjakmoyu/p/6781183.html

【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)相关推荐

  1. 【BZOJ4819】【SDOI2017】新生舞会(01分数规划,带权二分图匹配)

    Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的 ...

  2. [jzoj 4230] 淬炼神体{ 0/1分数规划+二分答案}

    题目 Description 王仙女将你提供的答案填在<葵花宝典>上,突然,宝典发出耀眼的白光,一股强大的吸力瞬间将仙女吸入宝典中. 一阵眩晕过后,仙女发现自己来到了一个浮岛上,四周的半空 ...

  3. BZOJ 4819: [Sdoi2017]新生舞会

    二次联通门 : BZOJ 4819: [Sdoi2017]新生舞会 /*BZOJ 4819: [Sdoi2017]新生舞会二分 + 01分数规划 + 最小费用流二分出一个答案费用流检验*/ #incl ...

  4. BZOJ4819: [Sdoi2017]新生舞会

    BZOJ4819: [Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有n个男生和n个女生参加舞会买一个男生和一个女 ...

  5. bzoj 3232 圈地游戏——0/1分数规划(或网络流)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...

  6. jzoj4017-逃跑【0/1分数规划,线段树,dp】

    正题 题目链接:https://jzoj.net/senior/#contest/show/3011/2 题目大意 n+1n+1n+1个连续的地方,每个地方有(a,b,c)(a,b,c)(a,b,c) ...

  7. jzoj3852-单词接龙【0/1分数规划,负环】

    正题 题目链接:https://jzoj.net/senior/#main/show/3852 题目大意 nnn个单词串,头尾有两个相同单词就可以连在一起,求一个最长的环使得平均单词长度最长. 解题思 ...

  8. [学习笔记]0/1分数规划

    对于一类:每个元素有两个属性A,B 选择若干个元素,使得$\frac{\sum A_i}{\sum B_i}$取到最值. 这类问题可以采用二分的方法.然后构造出模型用于判定. 推导: 二分mid 如果 ...

  9. #0/1分数规划,SPFA,负环#洛谷 1768 天路

    题目链接 分析 可以发现,这是一道0/1分数规划的题目,需要二分答案,然后判定是否存在负环,所以说bfs貌似不高效,那就用dfs吧,若二分答案为0,即不合法 代码 #include <cstdi ...

最新文章

  1. R语言使用DALEX包的model_profile函数对caret包生成的多个算法模型的离散变量进行分析、使用偏依赖图(Partial Dependence Plots)解释某个离散特征和目标y的关系
  2. C9---include,编译
  3. vue 在进入某一个页面的时候,created方法不执行,----亲测,通俗易懂
  4. Tachyon更名为 Alluxio,并发布1.0版本
  5. 每日一学:如何转换png图片为jpg图片
  6. 2021年上半年金融科技动向
  7. 王道 —— 进程同步、进程互斥
  8. android 9.0打开wifi,Android9.0 SystemUI 屏蔽打开wifi时不显示4G图标的逻辑
  9. [NOIP2009 最优贸易]
  10. 利用 openresty balancer_by_lua 实现一个简单的 ip_hash upstream 调度
  11. 控制 计算机某个程序自动开关,电脑自动开关机软件(示例代码)
  12. android手机录屏工具,安卓手机上有什么好用的屏幕录屏软件可以推荐?
  13. 车载双目摄像头,为什么特斯拉还在迟疑?
  14. 入职美团定级P7,最新最全180道高级岗面试题及答案
  15. swagger换新UI
  16. 甜糖官方爱快docker
  17. Java对数组降序排序
  18. 完美的Python代码制作“恐龙跳一跳“小游戏【附带源码 】
  19. springboot 做表白墙_基于微信云开发 SayLove 表白墙微信小程序V1.0
  20. 百络网警网络监控软件部署方案

热门文章

  1. 数影周报:字节跳动员工违规获取TikTok用户数据,阿里组织调整
  2. CloudKit快速入门之02 通过保存记录创建数据库架构 (SwiftUI iCloud CloudKit中文文档手册教程)...
  3. oracle sap金蝶,SAP、金蝶、ORA、用友ERP系统的对比
  4. 光环国际PMP:项目经理如何回答“这个项目要多久完成?”
  5. 【电脑技巧】windows11启动ie浏览器
  6. 西工大电子信息+校内调剂考研经验贴(专业课827)
  7. python查看电脑配置_教你怎么查看电脑配置
  8. 一个全栈开发工程师的职业规划
  9. Python面试简历分享
  10. 【STM32】STM32C8T6芯片的PWM模块介绍以及使用