description乙個三元組不是「剪刀石頭布情況」,當且僅當有乙個人贏了兩場。在一些一對一遊戲的比賽(如下棋、桌球和羽毛球的單打)中,我們經常會遇到a勝過b,b勝過c而c又勝過a的有趣情況,不妨形象的稱之為剪刀石頭布情況。有的時候,無聊的人們會津津樂道於統計有多少這樣的剪刀石頭布情況發生,即有多少對無序三元組(a,
b, c),滿足其中的乙個人在比賽中贏了另乙個人,另乙個人贏了第三個人而第三個人又勝過了第乙個人。注意這裡無序的意思是說三元組中元素的順序並不重要,將(a,
b, c)、(a, c, b)、(b, a, c)、(b, c, a)、(c, a, b)和(c, b, a)視為相同的情況。
有n個人參加一場這樣的遊戲的比賽,賽程規定任意兩個人之間都要進行一場比賽:這樣總共有場比賽。比賽已經進行了一部分,我們想知道在極端情況下,比賽結束後最多會發生多少剪刀石頭布情況。即給出已經發生的比賽結果,而你可以任意安排剩下的比賽的結果,以得到盡量多的剪刀石頭布情況。
input 輸入檔案的第1行是乙個整數n,表示參加比賽的人數。 之後是乙個n行n列的數字矩陣:一共n行,每行n列,數字間用空格隔開。
在第(i+1)行的第j列的數字如果是1,則表示i在已經發生的比賽中贏了j;該數字若是0,則表示在已經發生的比賽中i敗於j;該數字是2,表示i和j之間的比賽尚未發生。數字矩陣對角線上的數字,即第(i+1)行第i列的數字都是0,它們僅僅是佔位符號,沒有任何意義。
輸入檔案保證合法,不會發生矛盾,當i≠j時,第(i+1)行第j列和第(j+1)行第i列的兩個數字要麼都是2,要麼乙個是0乙個是1。
output 輸出檔案的第1行是乙個整數,表示在你安排的比賽結果中,出現了多少剪刀石頭布情況。
輸出檔案的第2行開始有乙個和輸入檔案中格式相同的n行n列的數字矩陣。第(i+1)行第j個數字描述了i和j之間的比賽結果,1表示i贏了j,0表示i負於j,與輸入矩陣不同的是,在這個矩陣中沒有表示比賽尚未進行的數字2;對角線上的數字都是0。輸出矩陣要保證合法,不能發生矛盾。
如果第i
個人贏了wi
場,答案就是c3
n−∑n
i=1c
2wi 。
先假設全輸,然後為每場比賽分配乙個贏家,費用拆邊計算增量。
#include
#include
#include
using namespace std;
const int
s=20005,t=20006,mod=20007,oo=0x3f3f3f3f;
int fir[20010],ne[200010],to[200010],w[200010],c[200010],
que[20010],in[20010],minw[20010],len[20010],fa[20010],
win[110],lose[110],cnt[110],id[110][110],val[110][110],winner[20010],
n,num,tot,ans;
void add(int u,int v,int
x,int
y)int node(int u,int v)
void check()
int main()
}for (int i=n+1;i<=tot;i++) add(s,i,1,0);
for (int i=1;i<=n;i++)
for (int j=1;j<=cnt[i];j++)
add(i,t,1,(win[i]+j)*(win[i]+j-1)/2-(win[i]+j-1)*(win[i]+j-2)/2);
ans=n*(n-1)*(n-2)/6;
for (int i=1;i<=n;i++) ans-=win[i]*(win[i]-1)/2;
//check();
while (1)
}in[u]=0;
}if (!minw[t]) break;
ans-=minw[t]*len[t];
for (int i=fa[t];i;i=fa[to[i^1]])
}//check();
for (int i=fir[s];i;i=ne[i])
printf("%d\n",ans);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
printf("%d
%c",val[i][j],j==n?'\n':' ');
}
bzoj2597 Wc2007 剪刀石頭布
今天注意力明顯不集中哎 頹 1a 了這道網路流題,思路確實神。題目是給你一張有向圖,讓你新增一些邊使得任意兩個點 a,b 直接都有一條有向邊,可以從a指向b,也可以由b指向a。讓你最大化三元環的數目。according to 姜爺,用補集思想,環不好搞,考慮三個點不成環,那那就是有乙個點連向其它的兩...
bzoj2597 Wc2007 剪刀石頭布
直接求不好求引入未知數,考慮採用補集轉化 對於一次非剪刀石頭布的情況,定是乙個人贏了另兩個人 若知道乙個人共贏了多少人,那麼就貢獻了n n 1 2種不同的情況 更一般的,乙個人如果多贏了乙個人,他的新增的貢獻就是他當前沒有加上這個人時已經贏了的人 費用流。st 比賽 人 ed,費用是遞增的,對於人拆...
bzoj2597 Wc2007 剪刀石頭布
time limit 20 sec memory limit 128 mbsec special judge submit 1765 solved 763 submit status discuss 在一些一對一遊戲的比賽 如下棋 桌球和羽毛球的單打 中,我們經常會遇到a勝過b,b勝過c而c又勝過a...