51nod 1397 最大二分图(图论+思维)

分析:其实是个数学题。。首先将已经匹配的m对连好,然后在不增加增广路的基础上尽量多地加边。对于二分图,增广路就是某条路径,第1、3、5、...、条边没有被连,第2、4、6...条边被连,且最后一条是被连的。然后将点分为4类:左边没有被匹配的为d1,左边与右边没有被匹配的点之间有通路的点为a1,左边与左边没有被匹配的点之间有通路的点为b1,左边没有与没有被匹配的点之间有通路的为c1,右边的同理设为a2、b2、c2、d2(- - 有点绕。。画个图就好理解了。。)。然后很容易可以得出结论:d1=n-m1,d2=n-m2,c1=c2,b1=a2,b2=a1,设a=a1,b=b1,c=c1,则a+b+c=m,并且由分类的定义和贪心可得,最终答案为ans=a^2+b^2+c^2+a*(n2-m)+b*(n1-m)+a*b。每个点至少连d条边,即c=0或c>=d,a>=d,b>=d,然后代到ans中讨论,又ans的单调性得到只有三种情况下可能取得最值,即(a,b,c)=(d,d,m-2*d),(m-2*d,d,d),(m-d,d,0),然后比较下谁大,注意检查无解情况即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 typedef long long ll;
 7 ll n1,n2,m,d;
 8 ll f(ll a,ll b,ll c){return a*a+b*b+c*c+a*(n2-m)+b*(n1-m)+a*b;}
 9 int main(){
10 //    freopen("e:\\in.txt","r",stdin);
11     int T;
12     scanf("%d",&T);
13     while(T--){
14         ll ans;
15         int k1=2,k2=2;
16         scanf("%lld%lld%lld%lld",&n1,&n2,&m,&d);
17         ll a1[3]={0,n1/2,m},a2[3]={0,n2/2,m};
18         if(n1==m||n2==m){
19             printf("%lld\n",n1*n2);continue;
20         }
21         if(m>n1||m>n2||m-d<d){
22             printf("-1\n");continue;
23         }
24         if(n1>n2){ll t=n1;n1=n2;n2=t;}
25         ans=f(m-d,d,0);
26         if(m-2*d>=0){
27             ans=max(ans,f(d,d,m-2*d));
28             ans=max(ans,f(m-2*d,d,d));
29         }
30         printf("%lld\n",ans);
31     }
32     return 0;
33 }
时间: 2024-10-20 19:17:29

51nod 1397 最大二分图(图论+思维)的相关文章

51nod 1391 01串(锻炼思维的好题)

题目http://www.51nod.com/onlineJudge/questionCode.html#problemId=1391?iceId=20917 1391 01串 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置i<=x <=j, S[i..x]中0比1多,而S[x + 1..j]中1比0多.求满足条件的最长子串长度. Input 一行包含

51nod 1821 最优集合(思维+单调队列)

题意:一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求选择一个S2的子集S3(|S3|<=k),使得S1∪S3的优美值最大. (集合元素可以重复) 我们首先考虑对于集合S1,能否求出它的最大优美值. 首先排序一遍,对于前i个元素,如果它的最大优美值为v,那么当S1[i+1]>v+1时,前i+1个元素的最大优美值依然为v,否则为v+S1[i+1].此处

51NOD 1279 扔盘子(二分 + 思维)

传送门 有一口井,井的高度为N,每隔1个单位它的宽度有变化.现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去). 盘子有几种命运:1.掉到井底.2.被卡住.3.落到别的盘子上方. 盘子的高度也是单位高度.给定井的宽度和每个盘子的宽度,求最终落到井内的盘子数量. 如图井和盘子信息如下: 井:5 6 4 3 6 2 3 盘子:2 3 5 2 4 最终有4个盘子落在井内. 本题由 @javaman 翻译. Input 第1行:2个数N, M中间用空格分隔,

51NOD 1413 权势二进制(思维)

传送门 一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成.例如0,1,101,110011都是权势二进制而2,12,900不是. 当给定一个n的时候,计算一下最少要多少个权势二进制相加才能得到n. Input 单组测试数据. 第一行给出一个整数n (1<=n<=1,000,000) Output 输出答案占一行. Input示例 9 Output示例 9 解题思路: 这个题目,其实这个题目就是求所有位数中最大的那个数,这个也是很难想到的.举个例子: 9998可以由8个111

hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)

题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数. 牌的表示方法为XY,其中X为面值,为2.3.4.5.6.7.8.9.T.J.Q.K.A中的一个.Y为花色,为S.H.D.C中的一个.如2S.2H.TD等. 输入 第一行为一个整数T,为数据组数. 之后每组数据占一行.这一行首先包含一个

Ehab and Path-etic MEXs图论思维题

传送门:https://codeforces.ml/contest/1325/problem/C 题意: 给你一个n个节点n-1条边的无向图,要求你要给每条边赋值,取值在0到n-2之间,要求给出一种构造方式,使每两对节点之间简单路径的边值组成的序列的mex值之和最小. 思路: 对于一条链来说(所以节点的度<=2),无论怎么赋值,mex的长度都超过了n-2,但当出现一个节点的度>=3时,我们就可以把0,1,2分配给那个节点的三条边,这样任意两对的节点的mex永远不会超过2,因为无论怎么连都无法同

(POJ 3067) Japan (慢慢熟悉的树状数组)

Japan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29295   Accepted: 7902 Description Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for the venue. Japan is tall island with N cities on the East coas

训练指南 UVALive - 3415(最大点独立集)

layout: post title: 训练指南 UVALive - 3415(最大点独立集) author: "luowentaoaa" catalog: true mathjax: true tags: - 二分图 - 图论 - 训练指南 Guardian of Decency UVALive - 3415 我们将男女分开来 就可以建出一个二分图,对于任意的男女生 只要上边四个条件一个也不满足 就表示不能同时去 ,那么我们在其中间连一条边,那么最终的结果就是我们从中取出尽量多的点,

训练指南 UVALive - 3126(DAG最小路径覆盖)

layout: post title: 训练指南 UVALive - 3126(DAG最小路径覆盖) author: "luowentaoaa" catalog: true mathjax: true tags: - 二分图 - 图论 - 训练指南 - 最小路径覆盖 Taxi Cab Scheme UVALive - 3126 题目大意:n个客人,从城市的不同位置出发,到达他们的目的地.已知每个人的出发时间hh:mm,出发地点(x1,y1)及目的地(x2,y2),要求使用最少的出租车接