Time of Update: 2018-12-05
/*********************************************題目大意:有一個100*100的正方形湖,湖中間有一個直徑為15的圓形小島;有n個點隨機分布在這個正方形中;一個人要從小島上跳出湖外,可以跳躍在這些點上;人每一步能跳的最大距離為d;求能跳出湖外所需的最小的跳躍距離和步數;演算法分析:首先計算每個座標兩兩間的距離;然後找出所有能從小島上一步跳到的點存入數組s中;然後找出所有能一步跳出湖外的點存入數組t中;設定兩個虛擬頂點s和t;用s與數組s中的所有頂點相連
Time of Update: 2018-12-05
/*選項組的bfs,用到了二進位狀態壓縮http://acm.hdu.edu.cn/showproblem.php?pid=1429*/#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include<queue>#define N 20010using namespace std;struct State{int
Time of Update: 2018-12-05
/*很經典的最大流最小割的題目題意:求最小割,但因為最小割是不唯一的,題目要求得到最小割的條件下使得割邊最少搜到usaco類似的一個題目才出的,構造很巧妙建邊的時候每條邊權 w=w*(E+1)+1;這樣得到最大流maxflow/(E+1) 就是答案了道理很簡單,如果原先兩類割邊都是最小割,那麼求出的最大流相等但邊權變換後只有邊數小的才是最小割了,至於為什麼乘的是(E+1)是為了保證邊數疊加後依然是餘數,不至於影響求最小割的結果*/#include <cstdio>#include &
Time of Update: 2018-12-05
/*二分圖 最大權匹配問題,題目給定條件可以看出是完備匹配;利用最小費用最大流解決X集合連源點,邊權為1,花費0Y集合連匯點,邊權為1,花費0X連Y中任意元素,邊權為1,花費為權值的相反數最後得到的最小費用就是最大權匹配*/#include <stdio.h>#include <iostream>#include <string.h>#include<queue>#include<cmath>using namespace
Time of Update: 2018-12-05
Harry Potter and the Forbidden ForestTime Limit: 5000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 158 Accepted Submission(s): 56Problem DescriptionHarry Potter notices some Death Eaters try to slip into
Time of Update: 2018-12-05
/*題意:在一張圖上刪去一條邊,使得從1到n的最短路最長剛開始枚舉要刪去的邊x,求最短路,複雜度是m*n*log(n);果斷tle了後來想想只要在不刪邊的情況下求得最短路,記錄最短路經過的邊,然後枚舉這些邊中的一條為刪去的邊求最短路,使得這個值最多即可很顯然,刪去的邊不是原先最短路上的邊最短路沒有變,不會有影響,所以不必枚舉*/#include <cstdio>#include <iostream>#include <memory.h>#include<
Time of Update: 2018-12-05
/*參考:http://zhyu.me/acm/zoj-1992-and-poj-1637.html題意:給出一個混合圖(有的邊有向,有的邊無向),問此圖是否存在歐拉迴路。先說說歐拉迴路吧,起點和終點相同,經過圖G的每條邊一次,且只經過一次的路徑稱為歐拉迴路。按照圖的不同分為:無向圖歐拉迴路、有向圖歐拉迴路和混合圖歐拉迴路。判斷一個圖是否存在歐拉迴路:1.無向圖:圖連通,且圖中均為偶度頂點。2.有向圖:圖連通,且圖中所有頂點出入度相等。3.混合圖:混合圖歐拉迴路的判斷是用網路流,實現方法:首先對
Time of Update: 2018-12-05
描述:從t字串中尋找s字串,查到,就輸出Yes,否則,輸出No#include <cstdio>#include <cstdlib>#include <cstring>char s[10010],t[1000010];int main(){ //freopen("a.txt","r",stdin); while(scanf("%s%s",s,t)!=EOF) { int len_s=strlen(s),len_t=strlen(
Time of Update: 2018-12-05
/*******************************************題目大意:有n個小孩在玩遊戲,每個小孩手上都有一個數字;第k個小孩先出去,然後給出手上的數值x;大於0的話就是從他左邊開始數的第x個小孩;否則就是從右邊數的第-x個小孩接著出列;直到所有小孩出列;第p個出列的小孩,將拿到f(p)個糖果;f(p)表示p的正因子個數;現在要求得到最多糖果的小孩;演算法分析:對於任何正整數x,其約數的個數記做g(x).例如g(1)=1,g(6)=4;如果某個正整數x滿足:對於任意i
Time of Update: 2018-12-05
/**********************************************題目地址:http://acm.whu.edu.cn/land/problem/detail?problem_id=1461題目大意:定義的一個求ch值的函數(見下面注釋部分);即求樹中根結點的ch值的方法,要你想辦法幫他實現這個程式;演算法思想:先一條鏈的情況:設第一個點的值是a,第二個是b,第三個是c...那麼有:ch[1]=ach[2]=a+bch[3]=max(2a+c,a+b+c)ch[4]=
Time of Update: 2018-12-05
/***********************************************題目大意:Q a b :查詢區間[a,b]的和;C a b x :
Time of Update: 2018-12-05
描述:問題就是劉汝佳書上的的區間選擇問題,如果不會的話就看看書吧#include <cstdio>#include <cstdlib>#include <cstring>int n,m;int cmp(const void *p1,const void *p2){ int a=((int *)p1)[0],b=((int *)p1)[1],c=((int *)p2)[0],d=((int *)p2)[1]; if(a<0) a=0;
Time of Update: 2018-12-05
/*操作a b c:[a,b]區間上的節點加上c,若節點的值已經超過P(包括等於),則加上2*c最後求每個節點的值和hdu3954很類似,具體參考:http://blog.csdn.net/wsniyufang/article/details/6702560每個區間設定min_dis;當區間中有一個點超過P時,釋放lazy*/using namespace std;const int N=200001;int n,m,P;struct Node{ int L,R;//區間左右邊界
Time of Update: 2018-12-05
描述:題目的意思是對0-n之間的數進行變化,,使之任何子序列都不能出現等差數列,1 2 4 3這樣也不行,因為1 2 3也是等差數列,而1 3 4 2卻可以,輸出任何一種即可,所以就採用了遞迴歸併的方法,先分成奇偶數列,然後奇偶數列再次分成奇偶數列,知道不能分為止#include <cstdio>int num[10010],t[10010];void solve(int x,int y){ if(y-x<=1) return; for(int i=x; i<
Time of Update: 2018-12-05
擴充歐幾裡得演算法,直接套模板即可。代碼如下:#include <cstdio>#include <cmath>#include <cstring>void gcd(int a, int b, long long &d, long long &x, long long &y){ if(!b) { d = a; x = 1; y = 0; } else {
Time of Update: 2018-12-05
描述:從最優二叉樹到最優二叉尋找樹,類似於哈夫曼樹,不過是和最小的哈夫曼樹,主要問題是選取結點,狀態方程v[l][j]=min(v[l][j],v[l][k-1]+v[k+1][j]+sum[j]-sum[l-1]-arr[k]);這樣的話就不用再求其深度,記錄其路徑,直接輸出就可以#include <cstdio>#include <cstring>#define M 255*255*105int n;int v[260][260],arr[260],sum[260];
Time of Update: 2018-12-05
描述:以第一個字串為貪心對象,在其他字串中尋找一個與此字串從字串下標開始匹配最多的字串,如果在匹配過程中存在不相符的,那麼前面這些匹配成功的就不需要再次不輸入,也就是說這些部分在press時就不需要了,只需要press以後不匹配的就可以了,然後在意這個字串為貪心對象,以此類推即可#include <cstdio>#include <cstdlib>#include <cstring>int cmp(const void *p1,const void *p2){
Time of Update: 2018-12-05
描述:比上一題還要麻煩的題,不過改進了方法,比上一題耗時還要少,先把輸入的數組複製成三分,分別在右,下,右下三個地方,然後計算從0下標到當前下標的和,然後再暴一下就可以了#include<cstdio>int main(){ // freopen("a.txt","r",stdin); int t,n,count,sum; int num[160][160]; scanf("%d",&t); while(t--) {
Time of Update: 2018-12-05
有s個衛星,剩下的全用無線裝置(求剩下的其無線電點中最大的兩個無線電之間的距離),實際就是是求最小產生樹中第p-s大的邊的長度,類比kruskal即可,注意其資料量是1000,而不是100。代碼如下:#include <iostream>#include <algorithm>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>using
Time of Update: 2018-12-05
描述:對於這道題,實在想不出如何用動規,所以就直接bfs#include <cstdio>#include <cstring>char s[5010][15];int main(){ // freopen("a.txt","r",stdin); int n,flag; while(scanf("%d",&n)!=EOF) for(int i=0; i<n; i++) { scanf("%s",