Time of Update: 2018-12-03
/*hdu 3157poj 3801題意:一個電路板,上面有N個接線柱(標號1~N) 還有兩個電源接線柱 + -然後是 給出M個組件正負極的接線柱和最小電流求一個可以讓所有組件正常工作的總電流 沒有則輸出impossible其實就是一個 有源匯 有上下界 最小流 問題處理有源匯有上下界最大流問題是:1.構造附加網路2.對ss、tt求最大流(ss、tt滿流則有解)3.若有解,對s、t求最大流而有源匯有上下界最小流問題則是:1.構造附加網路(不添加[t,s]邊)2.對ss、tt求最大流3.
Time of Update: 2018-12-03
/*這題深搜和廣搜都用到了廣搜比較簡單深搜的時候要注意是左優先還是右優先,還有就是當前的朝向(當前朝向的不同,導致對當前的左和右的方向不同)對本代碼來說:d1[4][2]={0,-1, -1,0, 0,1, 1,0}是左優先 ← ↑ → ↓
Time of Update: 2018-12-03
/*題意:從格子裡取數字,取了當前數字,則前一個後一個都不能取,前一行後一行也不能取看別人的 DP先是對每行DP f[i]=max(f[i-2]+a[i],f[i-1])每行計算過後,再對每行的結果進行這樣的DP這題很巧 對每行來說,其中的每個元素不能取其前面的和後面的把行當做元素,那麼這個矩陣也是一行,某行取了數,則其前一行和後一行不能模數型一樣 */#include<stdio.h>#include<string.h>int a[200010],dp1[200
Time of Update: 2018-12-03
簡單小題,沒什麼好說的。/* * hdu-1875 * mike-w * 2012-4-19 */#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define MAX_SIZE 128#define INF (1e20)#ifndef true#define true (1)#endif#define EPS (1e-5)double
Time of Update: 2018-12-03
/*題意:a有確定的值 其他的是隨機值通過運算,那些變數是確定的值map 的應用*///#pragma warning(disable: 4786)//加上這句可以屏蔽長標示符帶來的警告#include<stdio.h>#include<iostream>#include<map>#include<string>using namespace
Time of Update: 2018-12-03
/*給一棵樹,然後給一些點對,每對有一個LCA,輸出作為LCA的點,及其次數*/#include<stdio.h>#include<string.h>const int max=1000;struct Heap{//在別人的blog上看到的,挺好用 int head[max]; int key[max*max]; int next[max*max]; int pos; Heap(){clear();} void
Time of Update: 2018-12-03
/*題意:給出一個序列,問該序列的最長上升子序列的長度是多少,以及相同長度的,組成元素完全不同的最長上升子序列的個數。思路:第一問用O(n^2)的dp求解,第二問就是最多不相交路徑了。設最長上升子序列的長度為k,第一問解決後,dp數組中儲存的是以這個數結尾的最長上升子序列的長度,於是把每個數拆成兩個點i和i’,中間連容量為1的邊,表示每個數只能選一次,dp值為1的與源點連邊,dp值為k的與匯點連邊,容量均為無窮,然後枚舉所有的i和j(j<i),如滿足dp[j]+1==dp[i]且a[j]&
Time of Update: 2018-12-03
在這兒分享一題:codeforces 183A Zoo這題做的時候我愣是沒有想起來怎麼做,這解法也讓我很驚訝,儘管看題的時候注意到兩個樣本構成的都是正方形,當時還是沒有往哪方面想你可以親手畫一畫:1.剛開始時一個點 [0,0] 一行一列 一個點2.1走左上 [-1,0] [0,1] 傾斜45度的 一行兩列 兩個點2.2走右下 [1,0] [0,-1] 傾斜45度的 一行兩列 兩個點2.3走左下 [-1,0] [0,-1] 兩行一列 兩個點2.4走右上 [1,0] [0
Time of Update: 2018-12-03
容器的應用hdu4277#include<iostream>#include<vector>#include<cstdio>using namespace std;typedef long long lld;const int MOD=10003;vector<lld> v[MOD+10];int num,n,i,N[15];void insert(lld x){int key=x%MOD;for(i=0;i<v[key].size();i+
Time of Update: 2018-12-03
/*題目大意:有一個小偷要偷銀行的錢,可是他偷沒家銀行總是有一定的機率被抓,現在給了你一個機率P,只要他被抓的機率乘積不大與P,他就是安全的。問你在他安全的情況下,他最多可以偷多少錢。做這道題是,錯誤的認為題目所給的浮點型的資料都是精確到小數點後兩位,然後把機率放大100倍,轉換成為熟悉的01背包。。faint。。經測試題目的資料可能達到0.00001,甚至比0.00001還小,,所以必須轉換思路,,於是轉成以所有銀行的總資產為背包容量V。。求最大的逃跑機率。。注意:題目給我們的是被抓的機率,,
Time of Update: 2018-12-03
簡單的FLOYD。for(i=0;i<N;i++)for(j=0;j<N;j++)if(f[j][i]<INF) /* <===這裡! */for(k=0;k<N;k++)if(f[i][k]<INF && f[j][i]+f[i][k]<f[j][k])f[j][k]=f[j][i]+f[i][k];有趣的是上面的標記的代碼,有時這行代碼使FLOYD加速,有時反倒拖慢速度。看起來這個剪枝的效率和輸入有關。/* * hdu-1869 *
Time of Update: 2018-12-03
/*二分圖最小點覆蓋和最大獨立集都可以轉化為最大匹配求解。在這個基礎上,把每個點賦予一個非負的權值,這兩個問題就轉化為:二分圖最小點權覆蓋和二分圖最大點權獨立集。 二分圖最小點權覆蓋 從x或者y集合中選取一些點,使這些點覆蓋所有的邊,並且選出來的點的權值儘可能小。建模: 原二分圖中的邊(u,v)替換為容量為INF的有向邊(u,v),設立源點s和匯點t,將s和x集合中的點相連,容量為該點的權值;將y中的點同t相連,容量為該點的權值。在新圖上求最大流,最大流量即為最小點權覆蓋的權值和。
Time of Update: 2018-12-03
用T[m,n]表示對字串t從下標為m到n之間的部分進行全排列,則T[m,n]可以如下實現:用t[m]先分別與t[m…n]交換,每交換一次後對從下標為m+1到n之間的部分進行全排列開一個二維數組visited[][]來記錄交換的曆史,比如visited[a[m]-‘a’][a[n1]-‘a’]=1就表示a[m]與a[n1]交換過#include<stdio.h>#include<string.h>#include<stdlib.h>char a[50];int
Time of Update: 2018-12-03
這題兩種做法:1.暴力(本地暴力也可以,OJ上暴力也可以)2.推導(這兒有個推導過程連結,沒看懂)#include<stdio.h>bool flag[5005];void init(){int i,j,n,x,y;for(n=1;n<=5000;n++){for(i=1;i<=1000;i++){for(j=1;j<=1000;j++){x=i*i*j+1;y=i*i+j;if(x%n==0){if(y%n!=0){flag[n]=true;goto loop;}
Time of Update: 2018-12-03
/*給你一個碗,這個碗有點特殊,形狀是一個矩形,每個位置上數字是這兒碗底的高度(即:四周的高度比他高的時候這裡就可以盛水),求這個碗最多可以裝多少水思路是:這個碗可以被分解成幾個(也可能是一個),每個的形狀都和我們見到的普通碗一樣(即四周高,中間低),找到這個碗的邊緣最低的那塊,這個碗盛的水的最高水位就是這個高度,故從這個點開始擴充,比其低的是可以盛水的(加上高度差,並加入q隊列,以便繼續擴充下去),比其高的是邊緣(還可能是其他碗的邊緣,故加入pre優先隊列用於尋找下一個碗,所有的碗都是通過尋找
Time of Update: 2018-12-03
/*找出最長的字典序最小的公用子串這是我同學想的一方法在動態規劃的時候給每個狀態都求出 最長的字典序最小的公用子串動態規劃是二維的,同時還要存一個公用子串 所以需要一個三維的字元數組*/#include<stdio.h>#include<string.h>int dp[110][110],ls,lss;//dp動態規劃用,記錄長度 ls、lss分別代表s、ss的長度char s[110],ss[110],map[110][110][110];//map
Time of Update: 2018-12-03
#include<stdio.h>#include<string.h>int map[160][160],vis[160],dist[160],st,en;char start[35],end[35],name[160][35];int num;int zhao(){int xia=-1,i;for(i=1;i<num;i++)if(vis[i]==0&&(xia==-1||dist[xia]>dist[i]))xia=i;return
Time of Update: 2018-12-03
/*題目大意:某人n天給m個美女拍照每個美女都有一個最低要求每天有一個照片數量上限先給出n m每個美女的下限n個{ 第i天拍照的美女數 這天的照片數量上限依次是 美女編號 這天的下限 上限}有源匯 有上下界 最大流先對 附加 源匯ss tt求依次最大流若有可行流 再對s t求最大流這是第二次寫這個題,第一次寫的挺不順利(可能是構圖的時候出問題了,不是逾時就是錯,求最大流的方法就換了三種:sap遞迴,sap非遞迴,dinic我都懷疑我的最大流模版是不是有漏洞,下面的遞迴sap就是最初用的,
Time of Update: 2018-12-03
所給執行個體的“5 5 ”第二個5後還有一個空格,測試的時候出錯,但後台資料沒有那個空格,可以過#include<stdio.h>#include<queue>using namespace std;struct node{int x,y;};char map[100][100];int n,m;int dir[8][2]={-1,-1, 0,-1, 1,-1, -1,0, 1,0, -1,1, 0,1, 1,1};void bfs(int i,int j){
Time of Update: 2018-12-03
#include<stdio.h>int map[9][9],kong[90][2],kn;int ci=0,f;int he(int i,int j,int k)//判斷能填k不能{int o,p,oo,pp;for(o=0;o<9;o++)if(map[i][o]==k)return 0;for(o=0;o<9;o++)if(map[o][j]==k)return