http://blog.sina.com.cn/s/blog_87cb8e680100so6o.html 第一個,是二進位分解法:舉例,求2的13次冪,13=8+4+1,所以2^13=2^1 * 2^4 * 2^8所以我們只用求2^1, 2^2, 2^4, 2^8,然後再做兩次乘法就可以了,總共要4+3=7次乘法代碼:int power(int a, int n) {int r=1,p=a;while(n>0) {int bit=n&1;if(bit == 1)r*=p;p*=p;
功夫不負有心人,改了一天,總算AC。並查集用來表示等價類別,這裡的等價類別是什嗎?是“關係可以確定”。如果A和B的關係可以確定,B和C的關係可以確定,則A,B,C之間的關係都能確定,所以該關係有傳遞性。等價關係其他的兩個性質也都滿足。在此基礎上,我們又引進一個數組表示關係到底是怎樣的,並在尋找和壓縮路徑的過程中更新。/* * poj- Find them, Catch them * mike-w * 2011-10-26 * --------------------------- * url:
hdu2068RPG的錯排 錯排詳解:http://blog.csdn.net/jiahui524/article/details/6624977...hdu2068思路:http://hi.baidu.com/owen563/item/90f206307cbeb32ab2c0c5cd...組合公式
poj1125Stockbroker
hdu2680Choose the best route 先將多個起點用一個超級源點串連 ,權值為0然後用dijkstra就可以得到結果了 #include<iostream>using namespace std;#define INF 100000000int mp[1010][1010],dist[1010];bool visit[1010];int main(){int
Aizu 1180 Recurring Decimals 看到字串就頭疼啊。。。。超麻煩 //Aizu 1180 Recurring Decimals//字串 #include<iostream>#include<string>#include<algorithm>using namespace std;string aaaa[7]={"0","0","00","000","0000","00000","000000"};bool ba(char a,
題目連結: pku3259 Wormholes 之前在資料結構書上看了dijkstra 和floyed(從來沒有自己寫過) 但是有負權邊的一直不會 所以專門找了題目看看怎麼寫 感覺上bellmanford 跟 dijkstra 處理問題的關鍵步驟差不多都是不斷的鬆弛 但是bellmanford順序不同dijkstra是對每個點進行鬆弛 bellmanford則是對每一條邊進行鬆弛(實際上也是點,鬆弛有向線段的一個頂點) //pku 3259
hdu1596 find the safest road 最短路程改為最大機率之前的INF,min,三角不等式都需要修改 #include<iostream>using namespace std;#define INF 10000000int N,visit[1010];double mp[1010][1010],dist[1010];double dij(int s,int t){int i,j,k;memset(visit,0,sizeof(visit)); visit[s]
#include<iostream>using namespace std;int list[1010]={0,1,2,3};int Find(int N) //小於N的素數的個數 {int i;for(i=1;i<=1000;i++)if(N<list[i]) {i--;break;}return i;
hdu1690 Bus System floyd中3個迴圈的順序弄反了 wa了一天 = = 正確順序應該是先 中間節點 k ,然後才是 i , j。 #include<iostream>using namespace std;int INF = -1; __int64 mp[110][110],location[110],N,M,L1,L2,L3,L4,C1,C2,C3,C4;int Price(__int64 x){if(x<=L1) return
hdu2112HDU Today1.無向圖2.起點和終點可能是同一點,輸出為0#include<iostream>using namespace std;#define INF 1000000000int mp[160][160],visit[160],V;char name[160][35];int num(char t[]){int i;for(i=1;i<=V;i++){if(strcmp(t,name[i])==0){return i;}}strcpy(name[i],
#include<stdio.h>char s1[110],s2[110];int d[110][110];int p[5][5]={{0,-3,-4,-2,-1},{-3,5,-1,-2,-1},{-4,-1,5,-3,-2},{-2,-2,-3,5,-2},{-1,-1,-2,-2,5}};int Max(int a,int b,int c){if(b>a)a=b;if(c>a)a=c;return a;}int dp(int m,int n){int i,j;i=1
一個分行符號的問題wr十幾次 - -各種debug誒 #include<stdio.h>#include<math.h>#define INF 1000000000struct point{double x,y;} P[105];double D(point a,point b){return sqrt((b.y-a.y)*(b.y-a.y)+(b.x-a.x)*(b.x-a.x));}double mp[105][105];int main(){int T,n,i,
/*題意:有n個望遠鏡,被放置在X軸1~n的位置上,現有m只鳥,望遠鏡可以以任何角度觀察,能看到在那條直線上的所有鳥,問所有望遠鏡能看到的鳥的數量之和計算幾何+暴力*/#include<stdio.h>#include<string.h>int n,m;int num[1000010];struct line//邊結構{__int64 a,b,c;};struct point//點{__int64 x,y;}niao[300];line ppline(point
/*Ackerman函數:當m=1時:A(1,n) = A(0,A(1,n-1)) = A(1,n-1)+1 = A(0,A(1,n-2))+1 = A(1,n-2)+2..... = A(1,n-n)+n = A(0,1)+n=n+2;當m=2時:A(2,n) = A(1,A(2,n-1)) = A(2,n-1)+2 = A(1,A(2,n-2))+2=A(2,n-2)+2*2... = A(2,
看了那麼多題解 看不懂怎麼判斷環就算了 代碼還是錯的- -哎……一個大牛寫的 ,很簡單的思路http://yimaoblog.diandian.com/post/2011-02-22/18444418#notes 思想:並查集判斷部分的個數,用點的度來判斷是否是環,點構成環的充要條件是該環中每個點的度皆為2; 代碼流程:1、初始化每個點的度為0,每個點所屬集合(根節點)為其自身,標記值flag=1;
#include<stdio.h>#include<string.h>#include<stack>using namespace std;stack<int>s;int ret;struct node{int v,next;} e[100010];int ins[10010],fang[10010],head[10010],low[10010];int n,m,yong;void tarjan(int k){int
這部分涉及的知識為組合數和錯排 ,參考http://blog.csdn.net/jiahui524/article/details/6624977 比較簡單 hdu2068 #include<stdio.h>#include<math.h>__int64 C(int n,int m) //組合數公式{__int64 u,d,i; //組合數公式中的 分子u和分母dif(m>n/2) m=n-m;
hdu1506&pku2559 #include<stdio.h>int H[100005],l[100005],r[100005];main(){__int64 max,area;int i,n;while(scanf("%d",&n),n){for(i=1;i<=n;i++){scanf("%d",&H[i]);l[i]=r[i]=i;}for(i=1;i<=n;i++)while(l[i]>1&&H[i]<=