time limit: 20 sec memory limit: 128 mbsec special judge
submit: 1765 solved: 763
[submit][status][discuss]
在一些一對一遊戲的比賽(如下棋、桌球和羽毛球的單打)中,我們經常會遇到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個人參加一場這樣的遊戲的比賽,賽程規定任意兩個人之間都要進行一場比賽:這樣總共有場比賽。比賽已經進行了一部分,我們想知道在極端情況下,比賽結束後最多會發生多少剪刀石頭布情況。即給出已經發生的比賽結果,而你可以任意安排剩下的比賽的結果,以得到盡量多的剪刀石頭布情況。
輸入檔案的第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。
輸出檔案的第1行是乙個整數,表示在你安排的比賽結果中,出現了多少剪刀石頭布情況。
輸出檔案的第2行開始有乙個和輸入檔案中格式相同的n行n列的數字矩陣。第(i+1)行第j個數字描述了i和j之間的比賽結果,1表示i贏了j,0表示i負於j,與輸入矩陣不同的是,在這個矩陣中沒有表示比賽尚未進行的數字2;對角線上的數字都是0。輸出矩陣要保證合法,不能發生矛盾。
30 1 2
0 0 2
2 2 0
10 1 0
0 0 1
1 0 0
100%的資料中,n≤ 100。
分析:挺妙的一道題!
直接想怎麼構造最多的三元組很難. 反向思考. 用總的三元組的個數-最少的不合法的三元組的個數即為所求.
關鍵就是如何使得不合法的三元組最少.
首先要知道不合法的三元組有什麼特徵.畫個圖可以發現:乙個不合法的三元組中必然有乙個點,另外兩個點指向它.那麼答案就是
。第一部分是乙個定值,關鍵就是要使得第二部分最小.
每一條沒有確定方向的邊都只會對它連著的某乙個點產生貢獻,可以用容量表示數量的限制. 那麼貢獻是多少呢?
仔細分析,可以發現這其實是乙個貢獻遞增的模型,類似bzoj1449,bzoj1070.每條邊的費用只需要設為這一次的增量即可.
最後輸出方案列舉每條邊看是否滿流即可.
反向思考是很重要的技巧!遇到這類問題,要求的東西的條件非常多/複雜,減去不符合條件的即可.
tips:bzoj的spj好像有點問題?我的程式和標準輸出會有差異,過了洛谷的官方資料在bzoj上會wa掉.
#include #include#include
#include
#include
using
namespace
std;
const
int maxn = 110,maxm = 200010,inf = 0x3f3f3f3f,maxx = 20000
;int n,a[maxn][maxn],pos[maxn][maxn],ans,s,t,tot = 2
,cnt;
inthead[maxm],to[maxm],nextt[maxm],w[maxm],cost[maxm];
intvis[maxm],vis2[maxm],d[maxm];
void add(int x,int y,int z,int
p)void
pre()
if (a[i][j] == 1 || a[i][j] == 2
)
}}bool
spfa()}}
}return d[t]
}int dfs(int u,int
f)
int res = 0
; vis2[u] = 1
;
for (int i = head[u]; i; i =nextt[i])
}return
res;
}void
dinic()
intmain()
printf("\n
");}
return0;
}
bzoj2597 Wc2007 剪刀石頭布
今天注意力明顯不集中哎 頹 1a 了這道網路流題,思路確實神。題目是給你一張有向圖,讓你新增一些邊使得任意兩個點 a,b 直接都有一條有向邊,可以從a指向b,也可以由b指向a。讓你最大化三元環的數目。according to 姜爺,用補集思想,環不好搞,考慮三個點不成環,那那就是有乙個點連向其它的兩...
bzoj2597 Wc2007 剪刀石頭布
直接求不好求引入未知數,考慮採用補集轉化 對於一次非剪刀石頭布的情況,定是乙個人贏了另兩個人 若知道乙個人共贏了多少人,那麼就貢獻了n n 1 2種不同的情況 更一般的,乙個人如果多贏了乙個人,他的新增的貢獻就是他當前沒有加上這個人時已經贏了的人 費用流。st 比賽 人 ed,費用是遞增的,對於人拆...
BZOJ2597 WC2007 剪刀石頭布
在一些一對一遊戲的比賽 如下棋 桌球和羽毛球的單打 中,我們經常會遇到a勝過b,b勝過c而c又勝過a的有趣情況,不妨形象的稱之為剪刀石頭布情況。有的時候,無聊的人們會津津樂道於統計有多少這樣的剪刀石頭布情況發生,即有多少對無序三元組 a,b,c 滿足其中的乙個人在比賽中贏了另乙個人,另乙個人贏了第三...