題意:話說一個豬圈管理員,他本身沒有豬圈的鑰匙。每天會有許多顧客來買豬,這些顧客自己帶著某些豬圈的鑰匙。每當一個顧客來買豬,這些開啟的豬圈裡的豬可以隨意流動,買完豬之後開啟的豬圈全部關閉。現在已知每個豬圈裡豬的的數量,每一名顧客擁有的鑰匙以及他想購買的豬的數量。求管理員可以賣出的最大數量。題解:構圖是痛點在於豬的流動。我是這樣想的,假設顧客A可以開啟了豬圈1,3,5,他需要購買numA頭豬,由於每次被開啟的豬圈之間的豬可以自由分配,那麼豬圈1,3,5就可以視作一個集合X,當顧客A買完豬之後,集合
細數逝去的十周,傷心漠然,淡淡的感覺。時間是樣的好的東西,它可以讓你忘記同苦忘記憂傷,看懂一切。同樣時間也一點點拉大你們的差距沒次都是被虐,暴虐。如此反覆,說明一件事。:你呀要麼廢物,要麼腦殘。省賽還有十天!!!面對個人這麼多的問題: 1:敢於面對 2: 問題存在沒關係,關鍵是怎麼處理 怎麼做。 3: 培養自己做事的態度和決心!!!
題意:在一片草場上有K台擠奶機,每台擠奶機最多可以為M頭奶牛擠奶。有C頭奶牛。把奶牛和擠奶機看做個體,則所有個體之間有一定的距離。現在給出K,C,M以及所有個體之間的距離。在保證所有奶牛都可以擠奶的情況下,求路程最長的奶牛的最小路程。題解: 題目已經保證了所有奶牛都可以擠奶,那麼最長的路徑自然是 (頂點數-1) * 200。我們只需要二分最小路程,然後判斷在此情況下是否所有的奶牛都存在合適的匹配。#include <iostream>using namespace
題意:給出許多點的座標,用最小的正方形覆蓋之。題解:三分。注意精度····。公式神馬的畫個圖推一下即解決double mid1 = (left + right)/2; double mid2 = (mid1 + right)/2; 相比 double mid1 =left +(right - left)/3;double mid2 = right - (right - left)/3;要求更高的精度。 #include
題意:FJ帶他的朋友參觀農場,他們的起點是1,終點是N, 點與點之間可能存在路徑。現在要求從1到N,在從N回到1所走的最短路程。並且返回時已經被走過的路不能再走!題解:最小費用流。每條路只走一次,說明每一條邊的容量為1。由於是無向圖,所以從N走回1的過程其實就等同於再從1到N走一遍。那麼就需要尋找兩條從1到N的最短路徑。取一個超級源點,將其與1串連,邊的容量為2(兩條路),費用為0。N與一超級匯點串連,容量也為2,費用為0。還有加邊的時候需要特別注意!!!例如下面的圖:倘若輸入的是這樣一組資料:
題意:沙漠裡的王國需要修建水渠,串連國都與村莊····。說白了求一棵樹,每個點有三個座標(x,y,z)。邊的benifit為兩點之間的距離,cost為兩點的高度差。現在要求一棵樹使得 cost / benift 最小。題解:很顯然任意兩點之間都有邊,所以是一個很稠密的圖。用Prime。二分的話2800ms+, 迭代300ms+。#include <cmath>#include <iostream>using namespace std;#define MAX 1009#
題意:把n個點,分到m個組中。題目給出每一個點可以被分到的那些組。要求分配完畢後,最大的那一個組的人數最小。題解:比較怪。一開始化作費用流做。假設每一次增廣過後,路徑上所有邊的費用增大相等的值,這樣一來,被增廣過的路徑下一次就不會被立即增廣了。這樣就能使與匯點相連的那些點均勻增加。結果悲劇TLE```。#include <iostream>using namespace std;#define MAX 1001#define INF 999999999#define min(a,b)
題意:給出圓錐的表面積(包含底面)。求其最大體積,以及此時的底面半徑及高#include <cmath>#include <iostream>using namespace std;#define eps 0.00000005#define PI acos(-1.0) // PI用反三角函數比較準確int main(){double s;while ( scanf("%lf",&s) != EOF ){double v = 0.0;double low = 0,
題意:略。按公式便好。#include <cmath>#include <iomanip>#include <iostream>using namespace std;int main(){double one, two;char first, second;cout << setprecision ( 1 ) << fixed;while ( cin >> first && first != 'E' ){
題意:判斷圖中的最小產生樹是否唯一。題解:只需驗是否存在兩個或兩個以上權值相同的最小產生樹。注意:1.圖中任意兩點間最多隻有一條無向邊; 2.圖可能不連通(此時mst = 0)。Prime :複雜度 O( V ^ 2 )#include <iostream>using namespace std;#define MAX 101#define INF 999999999#define max(a,b) (a>b?a:b)int dis[MAX], pre[MAX];int
題意:統計每個格子裡面的玩具有多少。2318給出分隔板的時候是從左至右,2398的分隔板並沒有排序,得自己排一下。兩題就是輸出有點不同,其他沒什麼···POJ 2318:#include <iostream>using namespace std;#define MAX 5999struct CardBoard{int x1, y1, x2, y2;double k; } board[MAX];int cell[MAX];int judge ( int x, int y,
題意:已知有400個房間,有n張桌子必須從a 房間搬到 b 房間,搬每張桌子所花的時間都是10分鐘。走廊上每次只能容下一張桌子,但是不同的地方允許同時搬運。求將所有的桌子全部搬完最少要花多少時間。題解:給出兩種解法。#include <cstdlib>#include <iostream>using namespace std;struct item{int a, b, flag;} move [201];int cmp ( const void *x, const
題意:給出許多線段,問能否找到一條直線,使得所有線段在它上面的投影存在交點。題解:轉自http://blog.sina.com.cn/s/blog_6635898a0100n2lv.html1:把問題轉化為是否存在一條直線與每條線段都有交點。證明:若存在一條直線l和所有線段相交,作一條直線m和l垂直,則m就是題中要求的直線,所有線段投影的一個公用點即為垂足。2:枚舉兩兩線段的各一個端點,連一條直線,再判斷剩下的線段是否都和這條直線有交點。證明:若有l和所有線段相交,則可保持l和所有線段相交,左右
#include<stdio.h>#include<string.h>#define N 2001int grah[N][N];int sum;void prim(int n){int i,j,pos;int min,v[2001]={0},d[2001]; for(i=0;i<n;i++)d[i]=grah[0][i];v[0]=1;for(i=1;i<n;i++){min=99999999;for(j=0;j<n;j++){
題意:加上最少的邊,使得改造後的圖中去掉任意一條邊後圖依然連通。題解:先找出邊雙連通分量,然後縮點,的到一棵樹。需要加的最少邊=(leaves+1)/2PS:我們可以發現low[4]=3,low[7]=4 但是我們知道<4,7>這條邊並不是割邊.所以 low[u]!=low[v]是割邊的必要不充分條件. #include<cstdio>#include<string>#include<algorithm>using namespace
題意:判斷兩直線之間的位置關係,平行,重合,相交題解:注意精度#include <cmath>#include <iostream>using namespace std;#define MAX 100#define eps 1e-8#define zero(x) ( ((x) > 0 ? (x) : -(x)) < eps )struct Point { double x, y; };struct Line { Point a, b; };struct
題意:用k種不同的顏色給長度為n的項鏈染色。題解:1.旋轉置換:一個有n個旋轉置換,依次為旋轉0,1,2,```n-1。對每一個旋轉置換,它迴圈分解之後得到的迴圈因子個數為gcd(n,i).2.翻轉置換:分奇偶討論。奇數的時候 翻轉軸 = (頂點+對邊終點的連線),一共有n個頂點,故有n個置換,且每個置換分解之後的因子個數為n/2+1; 偶數的時候 翻轉軸 = (頂點+頂點的連線),一共有n個頂點,故有n/2個置換,且每個置換分解之後的因子個數為n/2+1; 或者 翻轉軸 =
題意:加上最少的邊,使得改造後的圖中去掉任意一條邊後圖依然連通。(圖是非簡單圖,需要判重)題解:先找出邊雙連通分量,然後縮點,的到一棵樹。需要加的最少邊=(leaves+1)/2我們可以發現low[4]=3,low[7]=4 但是我們知道<4,7>這條邊並不是割邊.所以low[u]!=low[v]是割邊的必要不充分條件.#include <iostream>using namespace std;#define N 10010#define min(a,b) (a<
題意:找從起點到終點的最短路徑。題解:可以知道,但凡兩點不能直達,則一定是沿著牆邊界點走的,這樣才能保證路徑最短。那麼只需要再所有可以直達的點間連上一條邊,求一次最短路徑。注意判斷兩線段是否相交應該是判斷“嚴格相交”,即不包含端點。#include <cmath>#include <cstdio>/*#include <iostream> //不知道為什麼加上這兩句就報一些奇怪的錯誤····using namespace std; */#define
題意:BL == N (mod P),並且p是素數題解:#include<cstdio>#include<cmath>#include<cstring>using namespace std;#define lint __int64#define MAXN 131071struct HashNode { lint data, id, next; };HashNode hash[MAXN<<1];bool