P3705 [SDOI2017]新生舞会

题目描述

学校组织了一次新生舞会,\(Cathy\)作为经验丰富的老学姐,负责为同学们安排舞伴。

有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴。

\(Cathy\)收集了这些同学之间的关系,比如两个人之前认识没计算得出\(a_{i,j}\)

\(Cathy\)还需要考虑两个人一起跳舞是否方便,比如身高体重差别会不会太大,计算得出\(b_{i,j}\) ,表示第\(i\)个男生和第\(j\)个女生一起跳舞时的不协调程度。

当然,还需要考虑很多其他问题。

\(Cathy\)想先用一个程序通过\(a_{i,j}\)和\(b_{i,j}\) ,求出一种方案,再手动对方案进行微调。

\(Cathy\)找到你,希望你帮她写那个程序。

一个方案中有\(n\)对舞伴,假设没对舞伴的喜悦程度分别是\(a'_1,a'_2,...,a'_n\)

假设每对舞伴的不协调程度分别是\(b'_1,b'_2,...,b'_n\)

令\(C=\frac{a'_1+a'_2+...+a'_n}{b'_1+b'_2+...+b'_n}\)

\(Cathy\)希望\(C\)值最大。

输入输出格式

输入格式:

第一行一个整数\(n\)。

接下来\(n\)行,每行\(n\)个整数,第\(i\)行第\(j\)个数表示\(a_{i,j}\)

接下来\(n\)行,每行\(n\)个整数,第i行第j个数表示\(b_{i,j}\)

输出格式:

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

说明

对于10%的数据, \(1≤n≤5\)

对于40%的数据, \(1≤n≤18\)

另有20%的数据, \(b_{i,j}≤1\)

对于100%的数据,\(a_{i,j},b_{i,j}<=10^4,1≤n≤100\)


做的第一道01分数规划的题。

01分数规划问题大多采用一种二分答案解法。

我们分数拆成整数,即

\(C*(b'_1+b'_2+...+b'_n)=a'_1+a'_2+...+a'_n\)

然后猜测一个\(C\)的值,检验在最优\(a,b\)配对的情况下左边与右边的大小关系,进而对\(C\)进行二分答案

如何求解最优配对呢?

再转化一下式子,左边-右边=

\(\sum_{i=1}^n (a'_i-b'_i*C)\)

我们要求解sum的最大值。

如果我们把对应点连上边\((a'_i-b'_i*C)\),就变成了跑 最大费用最大流或者 二分图带权匹配了

最后一点,这个题它卡常...


吸氧code:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=204;
const int inf=0x3f3f3f3f;
const double finf=1e100;
int a[N][N],b[N][N],n,used[N],pre[N];
double l=0.0,r=0.0,dis[N];
struct node
{
double c;
int from,to,next,w;
}edge[N*N];
int head[N],cnt=-1;
void add(int u,int v,double c,int w)
{
edge[++cnt].to=v;edge[cnt].from=u;edge[cnt].w=w;edge[cnt].c=c;edge[cnt].next=head[u];head[u]=cnt;
edge[++cnt].to=u;edge[cnt].from=v;edge[cnt].w=0;edge[cnt].c=-c;edge[cnt].next=head[v];head[v]=cnt;
}
queue <int > q;
bool spfa()
{
memset(used,0,sizeof(used));
memset(pre,0,sizeof(pre));
while(!q.empty()) q.pop();
for(int i=1;i<=2*n+1;i++) dis[i]=-finf;
dis[0]=0;
pre[0]=-1;
used[0]=1;
q.push(0);
while(!q.empty())
{
int u=q.front();
q.pop();
used[u]=0;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to,w=edge[i].w;double c=edge[i].c;
if(w&&dis[u]+c>dis[v])
{
dis[v]=dis[u]+c;
pre[v]=i;
if(!used[v])
{
used[v]=1;
q.push(v);
}
}
}
}
return dis[2*n+1]!=-finf;
}
bool check(double L)
{
memset(head,-1,sizeof(head));
cnt=-1;
for(int i=1;i<=n;i++)
{
add(0,i,0,1);
add(i+n,2*n+1,0,1);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
add(i,j+n,double(a[i][j])-double(b[i][j])*L,1);
double sum=0.0;
while(spfa())
{
int now=2*n+1;
while(pre[now]!=-1)
{
edge[pre[now]].w-=1;
edge[pre[now]^1].w+=1;
sum+=edge[pre[now]].c;
now=edge[pre[now]].from;
}
}
return sum<0.0;
} int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
r+=a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&b[i][j]);
while(l+1e-7<r)
{
double mid=(l+r)/2.0;
if(check(mid))
r=mid;
else
l=mid;
}
printf("%lf\n",l);
return 0;
}

2018.6.4

洛谷 P3705 [SDOI2017]新生舞会 解题报告的更多相关文章

  1. 洛谷3705 [SDOI2017] 新生舞会 【01分数规划】【KM算法】

    题目分析: 裸题.怀疑$ O(n^4log{n}) $跑不过,考虑Edmonds-Karp优化. 代码: #include<bits/stdc++.h> using namespace s ...

  2. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  3. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  4. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  5. P3705 [SDOI2017]新生舞会 01分数规划+费用流

    $ \color{#0066ff}{ 题目描述 }$ 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个女生一 ...

  6. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  7. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  8. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  9. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

随机推荐

  1. 一个有趣的问题——HTTP是“超文本传输协议”还是“超文本转移协议”

    最近在看<HTTP图解>这本书,书中提到了对国内对HTTP协议名称的翻译问题,并且给出了一些网友讨论的原稿链接,我看了一下觉得挺有意思的,另外我本人也觉得翻译对于理解协议本身非常重要,就整 ...

  2. [Oracle]OWI学习笔记--001

    [Oracle]OWI学习笔记--001 在 OWI 的概念里面,最为重要的是 等待事件 和 等待时间. 等待事件发生时,需要通过 P1,P2,P3 查看具体的资源. 可以通过 v$session_w ...

  3. 如何打造网站克隆、仿站工具(C#版)

    前两天朋友叫我模仿一个网站,刚刚开始,我一个页面一个页面查看源码并复制和保存,花了我很多时间,一个字“累”,为了减轻工作量,我写了个网站“克隆工具”,一键克隆,比起人工操作, 效率提高了200%以上, ...

  4. python 小问题收集

    1,python安装sqlclient yum install python36u python36u-devel yum install gcc mariadb-devel pip3 install ...

  5. 第十次Scrum meeting

    第十次Scrum  meeting 任务及完成度: 成员 1.2 1.3 陈谋 任务1040:完成stackoverflow的数据处理后的json处理(100%) 任务1114-2:完成对pdf.pp ...

  6. 关于五子棋游戏java版

    一 题目简介:关于五子棋游戏 二 源码的github链接   https://github.com/marry1234/test/blob/master/五子棋游戏 三.所设计的模块测试用例.测试结果 ...

  7. Weblogic 9.2和10.3 改密码 一站完成

    Weblogic 9.2和10.3可通用,只需修改参照如下配置即可: SET BEA_HOME=F:\beaSET JRE_HOME=%BEA_HOME%\jdk150_04\binSET LIB_H ...

  8. IIS7开启gZip动态压缩

    1.安装动态压缩模块: 安装过程可能的报错:This application has requested the Runtime to terminate it in an unusual way. ...

  9. Wordpress 更新时 不输入ftp相关信息的方法

    From 百度知道 我自己机器上面的处理过程为: cd /usr/share/nginx/html vim wp-config.php 在配置文件里面插入这三行 define("FS_MET ...

  10. Win2016以及win10 IIS10 下安装IEwebcontrol的方法

    1. 公司产品需要安装IE webcontrol控件 但是在win2016以及win10 上面安装时 因为IIS 已经升级到了IIS10 安装时会提示: 兼容解决的方法比较简单,修改注册表即可 HKE ...