POJ 2699 The Maximum Number of Strong Kings ——网络流
一定存在一种最优方案,使得分数前几个人是SK
所以我们可以二分答案或者枚举,然后就是经典的网络流建模。
另:输入很Excited
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath> #include <set>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue> using namespace std; #define F(i,j,k) for (int i=j;i<=k;++i)
#define maxn 1000005
#define inf (0x3f3f3f3f) int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} int m;
int a[101],S,T; bool cmp(int a,int b)
{return a>b;} int h[300001],to[300001],ne[300001],fl[300001],en=0;
int map[300001]; void add (int a,int b,int r)
{
to[en]=b;
fl[en]=r;
ne[en]=h[a];
h[a]=en++;
to[en]=a;
fl[en]=0;
ne[en]=h[b];
h[b]=en++;
} int mp[300001]; bool tell()
{
memset(mp,-1,sizeof mp);
queue <int> q;
while (!q.empty()) q.pop();
q.push(S); mp[S]=0;
while (!q.empty())
{
int x=q.front(); q.pop();
for (int i=h[x];i>=0;i=ne[i])
{
if (fl[i]>0&&mp[to[i]]==-1)
{
mp[to[i]]=mp[x]+1;
q.push(to[i]);
}
}
}
if (mp[T]==-1) return false;
return true;
} int zeng(int k,int now)
{
if (k==T) return now;
int ret=0;
for (int i=h[k];i>=0&&ret<now;i=ne[i])
{
if (fl[i]>0&&mp[to[i]]==mp[k]+1)
{
int tmp=zeng(to[i],min(now-ret,fl[i]));
fl[i]-=tmp; fl[i^1]+=tmp; ret+=tmp;
}
}
if (ret==0) mp[k]=-1;
return ret;
} int dinic()
{
int r=0,t;
while (tell()) while (t=zeng(S,inf)) r+=t;
return r;
} int hash[101][101],sum=0; bool test(int mid)
{
int cnt=a[0]; S=0;
for (int i=1;i<=a[0];++i)
for (int j=1;j<=a[0];++j)
hash[i][j]=++cnt;
T=++cnt;
for (int i=1;i<=a[0];++i) add(S,i,a[i]);
for (int i=1;i<=a[0];++i)
for (int j=1;j<i;++j)
if (j!=i){
add(hash[i][j],T,1);
if (a[i]<a[j]&&i<=mid) add(i,hash[i][j],1);
else
{
add(i,hash[i][j],1);
add(j,hash[i][j],1);
}
}
int out=dinic();
if (out>=sum) return true;
else return false;
} void init()
{
memset(h,-1,sizeof h);
en=0;
} void solve()
{
int l=1,r=a[0];
while (l<r)
{
init();
int mid=(l+r)/2+1;
if (test(mid)) l=mid;
else r=mid-1;
}
printf("%d\n",l);
} char s[1000]; int main()
{
cin>>m; gets(s);
while (m--)
{
sum=0;
cin.getline(s,100);
int x=0; a[0]=0;
for (int i=0;i<strlen(s);++i)
{
if (s[i]>='0'&&s[i]<='9')
a[++a[0]]=s[i]-'0',sum+=a[a[0]];
}
a[++a[0]]=x; sum+=x;x=0;a[0]--;
sort(a+1,a+a[0]+1,cmp);
solve();
}
}
POJ 2699 The Maximum Number of Strong Kings ——网络流的更多相关文章
- POJ 2699 The Maximum Number of Strong Kings Description
The Maximum Number of Strong Kings Description A tournament can be represented by a complete graph ...
- POJ 2699 The Maximum Number of Strong Kings (最大流+枚举)
http://poj.org/problem?id=2699 题意: 一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边(u, v)或( v, u),表示u打败v或v ...
- POJ - 2699 The Maximum Number of Strong Kings (最大流+枚举)
题意:有n(n<=10)个选手,两两之间打比赛,共有n*(n-1)/2场比赛,赢一场得1分.给出每个人最后的得分.求有多少个定义如下的strong king:赢了所有得分比自己高的人或本身就是分 ...
- poj 2699 The Maximum Number of Strong Kings 枚举 最大流
题目链接 题意 对于一个竞赛图(有向完全图),其顶点是选手,边是比赛,边\(e=(u,v)\)代表该场比赛中\(u\)战胜\(v\). 现定义选手的分数为其战胜的人的个数(即竞赛图中点的出度).并且定 ...
- poj 2699 The Maximum Number of Strong Kings【最大流+枚举】
因为n很小所以从大到小枚举答案.(从小到大先排个序,因为显然胜利场次越多越容易成为strong king.然后对于每个枚举出来的ans建图.点分别表示人和比赛.s向所有人连接流量为胜利场次的边,所有比 ...
- 【POJ2699】The Maximum Number of Strong Kings(网络流)
Description A tournament can be represented by a complete graph in which each vertex denotes a playe ...
- POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)
The Maximum Number of Strong Kings Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2488 ...
- POJ2699 The Maximum Number of Strong Kings
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2102 Accepted: 975 Description A tour ...
- 【POJ】【2699】The Maximum Number of Strong Kings
网络流/最大流/二分or贪心 题目大意:有n个队伍,两两之间有一场比赛,胜者得分+1,负者得分+0,问最多有几只队伍打败了所有得分比他高的队伍? 可以想到如果存在这样的“strong king”那么一 ...
随机推荐
- viewpager的使用-新方法 5.1
效果图: 添加依赖包: compile ‘com.android.support:design:22.2.0‘ 布局文件: <?xml version="1.0" encod ...
- Git .gitignore 设置为全局global
在操作Git时,我们会将修改的内容$git add . 到Git,Git会提示我们哪些文件都修改了.此时提示中会包括系统自动修改的文件,bin文件等.而我们add到Git时,并不希望将这些文件也一同a ...
- 正则表达说明—Pattern API
字符类 [abc] 匹配a.b.c任意一个字符 [^abc] 匹配除了a.b.c外的任意一个字符 [a-zA-Z] 匹配a-z或A ...
- x+2y+3z=n非负整数解
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; ty ...
- 1991: C语言实验——大小写转换
1991: C语言实验——大小写转换 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 183 Solved: 109[Submit][Status][We ...
- linux——nmap端口扫描命令
先安装 nmap :apt-get install nmap 端口扫描命令nmap -sS 172.16.55.100nmap -Pn 172.16.55.100第一组渗透测试指令,用于情报收集. 要 ...
- WebStorm换主题(护眼)
一.下载喜欢颜色的主题 http://www.phpstorm-themes.com/ 我用的豆沙绿护眼 <scheme name="Solarized Light My" ...
- Bootstrap历练实例:响应式导航栏
响应式的导航栏 为了给导航栏添加响应式特性,您要折叠的内容必须包裹在带有 classes .collapse..navbar-collapse 的 <div> 中.折叠起来的导航栏实际上是 ...
- bootstrap历练实例:标签式的导航菜单
本章将讲解bootstrap提供的用于定义导航元素的一些选项,它使用相同的标签和基类.nav.Bootsrtap也提供了一个用于共享标记和状态的帮助器类.改变修饰的class,可以在不同的样式间进行切 ...
- HTML5 FormData 模拟表单控件 支持异步上传二进制文件 移动端
FormData是XMLHttpRequest Level 2添加的一个新的接口,利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,还可以使用XMLHttpR ...