這應該說是比較神的乙個題目了
題意的話,就是有n 個人,兩兩之間打比賽,每場比賽贏的人加一分,總共呢有n*(n-1)/2個比賽,然後求這樣一種人的個數,就是能贏所有比自己分高的人或者他就是分最高的人。 當然我們是求這種人可能的最大個數,
建圖的話,就要分兩種點,人和比賽,很顯然,源點到所有的人建邊,容量是該人的得分,所有比賽與匯點建邊,容量為1。那麼現在要處理的就是人與比賽的關係了。
當我們看到n的大小最多只有10時,就應該意識到這個問題,是否可以列舉呢?
最裸的想法,二進位制位列舉strong kings,那麼複雜度大概是1000*60 * 60,貌似還不錯的樣子。
對每個strong kings,設其編號為i,某個比他分高的人為j,那麼他倆對應的比賽應該是i贏,那麼直接讓i去連線這個比賽點就行了,容量為1,代表這是乙個必要的邊,但是其他的比賽我們不知道結果,就要把比賽雙方i,j都連乙個容量為1的邊到對應的比賽點上。
實驗一下,125ms
然後就有了高階版本的想法了,可以意識到分數越高的人越有可能成為strong kings,然後我們列舉strong kings的個數k,讓佇列最後k個人成為strong kings。看到網上有人說strong kings'必然是'佇列中的後k個人,這句話顯然是錯的,我們可以通過構造無數不是這樣情況的序列, 但是我們可以確定的是,對於乙個序列,如果有k個strong kings,那麼必然存在一種情況,就是後k個人是strong kings。注意,是『存在』,而不是『必然是『。
現在開始證明 :
假設序列是這個模樣,1....i.....j.....k......n
i,k是strong kings,而j不是
假設j輸給了j+1至n區間中的x個人,那麼顯然i是贏了這x個人的,我們現在想把j變為strong kings
那麼就讓把j輸了的這些場全變成贏,此時分值改變了x,就將與i之前的人們的比賽多輸x場,這樣j的分數守恆了,但是j一贏之後,原本輸給的x個人的分數少了,那就讓他們都去贏i,這樣他們的分數也就守恆了,此時發現i分數又不守恆了,少了x,恰好剛才j去輸給i之前的人了x場,i正好去贏x場,這樣大家的分數都守恆了。
就這樣我們把乙個不連續的strong kings們變的緊密了一些,依次這樣,直到strong kings都在序列的後面
然後發現,瞬間變成了0ms
#include #include #include #include #include #include #include #include #include #define maxn 75
#define maxm 5555
#define inf 1000000007
using namespace std;
struct node
edge[maxm];
int dist[maxn], numbs[maxn], src, des, n;
int head[maxn], e;
void add(int x, int y, int c)
void rev_bfs()
q[qtail++] = des;
dist[des] = 0;
numbs[0] = 1;
while(qhead != qtail)
}}void init()
int maxflow()
totalflow += augflow;
u = src;
}int i;
for(i = curhead[u]; i != -1; i = edge[i].next)
if(edge[i].cap > 0 && dist[u] == dist[edge[i].ver] + 1)break;
if(i != -1) // find an admissible arc, then advance
else // no admissible arc, then relabel this vertex
}return totalflow;
}int id[22][22];
int score[22];
int fg[22][22];
int nt, num;
void cut(char *s)}}
}void build(int k)
int main()
}printf("%d\n", ans);
}return 0;
}
POJ 1018 列舉 貪心
題意 有n件商品,每件商品有m個製造商,每個製造商製造的商品有不同的 頻寬和 每件商品必須選乙個製造商,最後的頻寬是所有頻寬中的最小值,價值是所有商品的總 目的是使b p最大,輸出最大的b p的值。思路 由於資料範圍比較小,所以可以列舉。可以求出所有製造商的商品的最大頻寬和最小頻寬,然後列舉在兩者之...
poj 2002 列舉 雜湊
給定n個點,求出這些點一共可以構成多少個正方形。sample input 4 1 00 1 1 10 0 90 0 1 02 0 0 21 2 2 20 1 1 12 1 4 2 5 3 70 0 5 20sample output 1 61可列方程 可以得出 知道兩點求出其餘兩點 x3 node ...
poj1873 列舉 凸包
題意 平面上有n棵樹,現在要砍掉其中的一部分來做成籬笆將剩下的樹包圍起來,現在給出每棵樹的座標 價值和可以製造籬笆的長度,求砍掉最少價值的樹,將剩下的樹包圍起來,當兩種方式的價值相同時,取砍掉樹更少的方式。由於樹棵樹不大於15,可以二進位制列舉情況,求出其它樹構成的凸包的周長即可 include i...