Time of Update: 2018-12-05
描述:無根樹題目,實際上就是找一條關鍵路也就是最長路,用dp做#include <cstdio>#include <cstring>#include <vector>using namespace std;typedef struct{ int x,y;} Pair;vector <Pair> v[10010];int dp[10010],sum;bool vis[10010];void dfs(int cur){ int sec=0;
Time of Update: 2018-12-05
描述:見劉汝佳編碼解碼題目#include <cstdio>#include <cstring>#include <cstdlib>char s[110],str[110];int flag,n,pos;long long cal(int q){ long long sum=1; for(int i=2; i<=q; ++i) sum=sum*i; return sum;}bool solve(){ int len=
Time of Update: 2018-12-05
描述:求第I個人贏的機率,公式為:p*(1-p)^(I-1)*(1+(1-p)^n+(1-p)^2n(1-p)^3n....),由此可以得到化簡公式p*(1-p)^(I-1)*((1-(1-p)^n^2)/(1-(1-p)^n))(等比數列),由於此項(1-(1-p)^n^2)接近於1,就當作1來處理,所以可得p*(1-p)^(I-1)/(1-(1-p)^n),但是p為零的時候要特殊處理#include <cstdio>#include <cmath>int main()
Time of Update: 2018-12-05
dp+大數加法。設母串的長度為 j, 子串的長度為 i,我們要求的就是長度為 i 的字串在長度為 j 的母串中出現的次數。(1)若母串的最後一個字元與子串的最後一個字元不同,則長度為 i 的子串在長度為 j 的母串中出現的次數就是母串的前 j - 1 個字元中子串出現的次數,即 str[i][j] = str[i][j - 1];(2)若母串的最後一個字元與子串的最後一個字元相同,那麼除了前 j - 1 個字元出現子串的次數外,還要加上子串的前 i - 1 個字元在母串的前 j - 1
Time of Update: 2018-12-05
描述:其實是個dp題,然後再計算兩者的最大公約數化成最簡#include <cstdio>#include <cstring>int n,m,p[25];unsigned long long v,sum,dp[30][150];unsigned long long gcd(unsigned long long a,unsigned long long b){ if(a%b==0) return b; else return gcd(b,a%b);}int
Time of Update: 2018-12-05
描述:資料太大,四維數組開不下,然後不考慮重複情況,直接暴會逾時,只能採用遞迴dp,而且這道題的資料範圍有問題,給出的資料範圍太小,望注意……#include <cstdio>#include <cstring>#define N 0x7fffffffint v[701][201][101];int t,c,n_1,n_5,n_10,len;int min(int x,int y){ return x>y?y:x;}int dp(int f,int
Time of Update: 2018-12-05
描述:dp題目,對二維數組直接輸入,沒有轉化提交時一直wa,後來轉化後,提交就正確了,狀態方程dp[i][j][m]+=dp[i+1][j][m-num[i][j]]+dp[i+1][j+1][m-num[i][j]],從下往上狀態轉移便於輸出#include <cstdio>#include <cstring>int n,m,p;int num[50][50];long long sum,dp[50][50][510];int main(){ // freopen(
Time of Update: 2018-12-05
描述:紅黑襪子,給出的是紅襪子被選到的機率,即為p/q,要計算的是在挑選出一對紅襪子之前的紅襪子和黑襪子的數目,假設紅襪子數為n,黑襪子數為m,那麼n(n-1)/(m(m-1))=p/q,求出紅襪子數和黑襪子數即可#include<cstdio>#include <cmath>#define LL long longLL gcd(LL x,LL y){ if(x%y==0) return y; else return gcd(y,x%y);}int main(
Time of Update: 2018-12-05
描述:相當於一棵樹,考慮所有的情況,dp#include <cstdio>#include <cmath>char s[18][15];double dp[20][6],num[18][18];int main(){ // freopen("in.txt","r",stdin); int n,p,q; for(int i=0; i<16; ++i) scanf("%s",s[i]); for(int i=0; i<16; ++i)
Time of Update: 2018-12-05
描述:有兩個罐子,一個罐子裡有一個紅球,另一個罐子裡有一個紅球和一個白球,每次從兩個罐子裡各取一個球,然後在向每個罐子裡各加一個白球,一次取到兩個紅球時就結束取球,求n次取球中至少一次為取球為紅球的機率,然後再求n次取球皆為紅球的機率前面零的個數(即從小數點起到後面第一個不為零結束,一共有多少個零)#include <cstdio>#include <cmath>double arr[1000000],num[1000000];int main(){
Time of Update: 2018-12-05
描述:狀態方程p[i][j]=dp[i-1][k]+dist(k+1,j),由於沒搞懂距離dist是怎麼計算的,以為是num[j]-num[k+1],結果wa了一次,在狀態轉移的時候,採用一個數組sc記錄一下節點的位置#include <cstdio>#include <cstring>#define N 0x7fffffff;int num[210];int dp[35][210];int sc[35][210];void show(int cur,int pos){
Time of Update: 2018-12-05
描述:給你n個人,給出每個人會購物的機率,然後給你r,即r個人會購物其餘人都不購物。然後需要你輸出n行,第i行就是這個r個人中有一個是第i個的機率是多少 其原型就是,有5個人,選3個人出來,甲在其中的機率。不過5變成了n,3變成了r。這個樣子的話就是一個條件機率 即p為從n個人中選r個的機率。t就是甲在其中的機率 t/p就是答案 這個樣的話,只能暴力了,即在n個人中找出r個人(就是一個組合,不是排列),把這r個人的機率相乘其餘人的反面機率相乘。然後所有的這些我機率相加就是p。然後同樣的,選定甲,
Time of Update: 2018-12-05
先按力量排序,然後dp在前i個烏龜中j個烏龜可以重疊的最小重量,其實就是對於每個烏龜i選或是不選的問題。狀態方程:dp[i, j] = min{dp[i, j-1], dp[i-1, j-1]+w[i]}.代碼如下:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;typedef struct Turtle{
Time of Update: 2018-12-05
巴什博奕。代碼如下:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;bool ways[1002];int vis[10] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512};int main(){#ifdef test freopen("input.txt", "r",
Time of Update: 2018-12-05
最長公用子序列,將1改為相應權值(即:每個長方體的高度值),其中注意給出的n個長方體,是長方體的種數,也就是說每種長方體可以有無數個。代碼如下:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;int step[3][3]={{0,1,2}, {0,2,1}, {1,2,0}};int num, dp[100],
Time of Update: 2018-12-05
類似巴什博奕,先行者要贏,假設先行者必贏的狀態為1,必輸為0。則其通過集合中存在的數可以達到之前的某個0的狀態,則目前狀態為1,如果通過所有集合中的數都無法達到之前的某個為0的狀態(即:可到達的之前狀態全為1),則目前狀態為0。因為先行者如果可以達到之前某個為0的狀態,則說明其達到前面這個0的狀態時它實際對於之前的這個狀態來說是個後行者,0代表在之前的這個狀態來說是後行者贏,則對現在狀態來說是先行者贏。代碼如下:#include <iostream>#include
Time of Update: 2018-12-05
Nimm博弈,需要統計可行方案的個數。代碼如下:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;int ways[102];int main(){#ifdef test freopen("input.txt", "r", stdin);#endif int m; while(scanf("%d",
Time of Update: 2018-12-05
巴什博奕。代碼如下:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;bool ways[1002];int main(){#ifdef test freopen("input.txt", "r", stdin);#endif int c, n, m; scanf("%d", &c);
Time of Update: 2018-12-05
巴什博奕。(1)如果m>n,則先行者第一次取n~m之間任意數都能保證其必勝。(2)如果n%(m+1)==0,則必敗。(3)如果n%(m+1)!=0,則第一次先行者必須拿n%(m+1)個,才能保證必勝。代碼如下:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;int ways[102];int main(){#
Time of Update: 2018-12-05
#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include <algorithm>#include<set>#include<queue>#define LL long long#define inf 0x7fffffff#define E 1e-9#define M