import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int b[]=new int[3];//String s=scanner.nextLine();//nextLine使用時要注意,它會忽略當前行,且nextline是讀取當前行 while(scanner.hasNextLine()){
題意:一開始腦殘吧組合數公式算錯了,要先把c[i][i]和c[i][0]賦1才行。又是條件機率,要計算燈亮的機率是,燈的位置也必須考慮在內的#include<cstdio>#include<cstring>const int LMT=55;double dp[LMT][LMT],p,myp[LMT],nmyp[LMT],c[LMT][LMT];//考慮位置啊。。。void init(void){int i,j;memset(dp,0,sizeof(dp));c[0][0]
做法:直接背包搞之,背包的容量是當前獲得的鈔票數#include<cstdio>#include<cstring>const int LMT=102;double safe[LMT],dp[LMT*LMT];int M[LMT];void init(void){ memset(dp,0,sizeof(dp)); dp[0]=1.0;}int main(void){ int T,n,end,ans,i,j; double p,x,tem;
第一次寫並查集題目,這個很純-,-題目意思是要找出所有與0相關的數位數目。寫個集合把他們串起來就行了。首先根節點的父親節點表示這個集合的數目,這樣就不用重新開數組儲存數目了。再做幾個,並查集入門。#include<iostream>//poj1161#include<cstdio>#include<cstring>using namespace std;int N,M,K;int pre[30005];void UFset(){int i;for(i=0;i&
做法:一開始就想到dijstra,可惜了...DP瞭解不深#include<cstdio>#include<cstring>#include<queue>#include<utility>#include<vector>#define eps 1e18#define LL long
做法:其實題目中給的就是一棵有根樹,一開始鬧慘以為可能存在多個連通分量。帶環的,資料量又那麼大,又看了大神的部落格,慢慢神傷...如果當前節點是葉子節點,那麼dp[x]=1-e[x]-k[x]+k[x]*dp[1]+sigma(p[i]*dp[fahter[i]]);如果不是dp[x]=1-e[x]-k[x]+k[x]*dp[1]+sigma(p[i]*father[i])+sigma(p[i]*son[i]);由於葉子節點沒有son,而且,某個節點中的,他的兒子的faher就是自己(廢話了,,
相當裸,練練手了,還有不到一個月了阿.看DD牛的背包九講,,,,中.http://poj.org/problem?id=3624dp[v]表示容量為V的背包可以裝的最大價值.#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAXI 4005#define MAXV 24888int dp[MAXV];int main(){int N,M;int
做法:看清題意即可。#include<cstdio>#include<cstring>const int LMT=30;int head,cnt,tr,lev;struct node{int l,r,data;}nod[LMT];char ans[LMT],sec[LMT][LMT];void init(){int i;for(i=0;i<LMT;i++)nod[i].l=nod[i].r=-1;memset(ans,0,sizeof(ans));tr=head=0
做法:基本題了,被魔法消耗坑了,每次兩點...#include<cstdio>#include<cstring>#include<cmath>#define eps 1e8const int LMT=1002;double dp[LMT][LMT],p[3][LMT][LMT],ep[LMT][LMT];void init(void){ memset(dp,0,sizeof(dp));}int main(void){ int r,c,i,j;
.75pt outset windowtext;mso-border-insidev:.75pt outset windowtext">笑話一:幽默簡訊 宋體"> text-indent:-29.0pt;mso-char-indent-count:-2.0">一位憨厚的男孩向一心儀已久的女孩鼓足勇氣問: font-family:微軟雅黑;color:red">你喜歡啥樣的男孩?
題意:街道上有人和出租車,輸入人和車的位置,然後計算所有人都上車的最短時間,每個人同時上車做法:匈牙利演算法直接...#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int LMT=102;double gra[LMT][LMT],chose[LMT*LMT],x[LMT<<1],y[LMT<&
#include<cstdio>#include<cstring>const int LMT=2005;double dp[LMT][LMT],get[2][8];void init(void){ memset(dp,0,sizeof(dp)); dp[0][0]=1.0;}int main(void){ int ha,hb,i,j; double wa,wb,p,ans;
題意:要求長度為N的位元字中,它的所有字串(注意是any)中0 1的差的絕對值不大於K。做法:從長度為1 的時候開始算起,每一次操作都是增加了一個1或者一個0,那麼可以為用這個當做狀態,記得狀態劃分時,增加末尾數字改變的是任何一個含有末尾字元的字串中0,1的數量,這裡就有一個遞推關係了,要目前狀態的尾碼字串有效,那麼必須它的前面的那個字元夠成的尾碼字串有效,這樣一來,最終會把所有字串中的所有字串考慮進去。一開始是想考慮所有首碼串的,可是無法與狀態結合起來啊。。。。#include
#include<cstdio>#include<cstring>#define LL __int64const int LMT=55;LL dp[LMT][LMT];bool is[LMT][LMT];void init(void){ memset(is,0,sizeof(is)); memset(dp,0,sizeof(dp));}LL gcd(LL a,LL b){ return b?gcd(b,a%b):a; }int main(void){
題意:輸入一個A矩陣,按照一個公式,找出B矩陣。做法:高中的時候學過線性最佳化,那個公式放置在矩陣中就可以用線性最佳化表達出要被考慮進去的A中的元素,對了,注意1*2的情況#include <iostream>#include <cstdio>#define min(a,b) a<b?a:b#define LMT 1002using namespace std;int a[LMT][LMT],b[LMT][LMT];int main(){ int n,m;
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;//高精度注意-0.000000//有序無序輸入要注意啊struct matrix{int n,m;double mat[2][2]; void clear(void){memset(mat,0,sizeof(mat));}void get_e(void){int i=0;clear();for(i=0;i<n;
做法:基本的成段更新,記住成段更新的原則啊,懶惰更新就是:每一次所加入的影響總有一個範圍,現在只要求更新到影響範圍的子區間即可,然而,對原狀態的影響必須原封不動的體現出來,這樣一來,必須開一個標識數組,這個數組是來儲存是否受影響,受了什麼樣的影響,在割裂區間時,可以方便把影響下方到他的子區間上,但原區間的影響必須在加入影響是就已經作用了,而不是equry時在加上去,這就不違背了上面那個原則了,一時感想,勿噴...#include <iostream>#include
做法:一開始粗心了,算某個人晉陞的機率時要考慮他自己到當前這種等級的機率和他的對手到這種等級的機率,還有他自己打敗他的對手的機率,2了第一個機率沒有乘。#include<cstdio>#include<cstring>const int LMT=7;double dp[LMT+3][1<<LMT],mat[1<<LMT][1<<LMT];int n;void init(void){int i;memset(dp,0,sizeof(dp)
做法:如果當初英語閱讀仔細一點就好了,類似於高中的時候常做的,在一個箱子裡摸n個球#include<cstdio>int main(){ int n,m,h,rest=0,us=0; double ans=1; scanf("%d%d%d",&n,&m,&h); for(int i=0;i<m;i++) { int x; scanf("%d",&x); rest+=x;
做法:按位暴力DFS吧...這裡很明顯沒有考慮當前數字是否是首位,其實不需要啊,因為這種情況發生的時候肯定是那種比邊界數少一位的數字。也就是說如果求1234 那麼這裡要考慮的是 0 ---999的數字中的mountain, 沒有考慮首位的後果是moutain的形態不同,可是很容易證明,規定位元的數字只有兩種moutain,而這種兩種moutain在 0---999中的個數相同。#include <iostream>#include <cstdio>#include