Time of Update: 2018-12-04
題意:輸入n,m,n個目標數,m個匹配數,求出每個目標數與匹配數相同的個數,沒有的話為0思路:排序檢索題,,可以把字串轉化為整數,然後再檢索是否相同#include<stdio.h>#include<string.h>int change[] = {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};int main() {int cas;int arr[5005],
Time of Update: 2018-12-04
題意:給出n個字元(rule)和其代替的字元,如果字串中有出現上述所給的字元,就要替換字串思路:換的時候要注意先後順序,要第一個rule已經不能再替換了,才能進行下一個,看了別人用函數,相當快!!!strstr函數,神器。。。。。#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){int n;char s[100][100], str[100][100];char s1[1000],
Time of Update: 2018-12-04
題意:輸入一組資料,每個元素都有優先順序,優先順序從1到9.計算出當目標任務完成後,所需要的時間思路:如果第一個元素的優先順序不是最高,就將這個元素放到隊列末,如果其優先順序最高,但不是目標任務的話,就將其刪掉,時間就+1,如果是目標任務的話,就輸出時間#include<stdio.h>#include<queue>#include<stdlib.h>#include<algorithm>using namespace std;struct
Time of Update: 2018-12-04
#include<stdio.h>#include<stdlib.h>typedef struct treeNode{struct treeNode *left,*right;int data;}treeNode;treeNode* createTree(){treeNode *node[10];int i = 0;for(i = 0 ; i<10;i++){node[i] = (treeNode*)malloc(sizeof(treeNode));node[i]
Time of Update: 2018-12-04
題意:嵌套娃娃,在裡層的娃娃的尺寸要小於外層的娃娃,有可能一個娃娃裡面有多個娃娃,而這多個娃娃尺寸和要小於外層的,相當與匹配括弧的加強版,有些但疼。思路:要多容量大小是否足夠的判斷,小看了別人的一些思路,自己寫了代碼。下面的核心代碼是deal函數,用的是錯位的方法(個人覺得),同一top的sum[top]和stack[top],其實是sum[top]是在stack[top]內層的容量,比如-5 -3 3 5,sum[0] = 5,stack[1] = -5,sum[1] = 3,stack[2]
Time of Update: 2018-12-04
havel定理函數模組化思想#include<iostream>#include <algorithm>using namespace std;struct Node{int degree;int index;};Node lake[20];int la[20][20];int n;bool compare( Node a, Node b){return a.degree > b.degree;}void input(){for(int i = 0; i <
Time of Update: 2018-12-04
題意:距離*重量,要使整個天平各個節點左右相等思路:利用遞迴,從最底層判斷是否相等#include<stdio.h>int flag;int dfs() {int wl, dl, wr, dr;scanf("%d %d %d %d", &wl, &dl, &wr, &dr);if (wl == 0)wl = dfs();if (wr == 0)wr = dfs();if (wl * dl == wr * dr) return wl +
Time of Update: 2018-12-04
所謂零,就是5*2,所以 “n!末尾有多少個零”==“min(n!的質算因子中5的數目,n!的質因子中2的數目”又因為n!的質因子中5的數目必然小於等於2的數目,所以題目就變成了求n!的質因子中5的數目。比如 26! 是 1*2*3*4*5*6……24*25*26,它們中間有多少個數能被5整除?當然是26/5=5個,但看25,它本身是5*5,也就是25代表著2個5,所以26!尾部零的數目等於 26/5 + 26/25 + 26/125 + ...現在來計算1000!的末尾有多少個零,那麼就是10
Time of Update: 2018-12-04
題意:N個木塊,有四種規則要你按照這些規則擺放木塊,最後輸出。思路:首先要搞懂規則。1,move a onto b:將a,b上的木塊放回原來的地方,然後將a放到b上面;2,move a over b:a上的木塊放回原來位置,再將a放到b的最上面3,pile a onto b:將b上的木塊全部放回原來位置,將a以及a以上的木塊整體移動到b上面;4,pile a over b:將a以及a以上的整體移動到b的最上面(b的木塊不用動)這道題就是單純類比,感覺類比題會很煩人,一不小心就這寫錯,那寫錯。。。
Time of Update: 2018-12-04
題意:有兩個樹,求兩棵樹連線上是否存在垂線,求垂線兩個端點的左邊。思路:其實題目的意思,就好比是四個點構成一個正方形,類似的,就是要求其他兩個端點的座標,我用的是向量旋轉,求另外兩點。 公式就是(xcost - ysint,xsint + ysint),這裡正好t為直角,所以就是旋轉之後的向量是(-y, x)#include<stdio.h>int main(){double x1, y1, x2, y2;double ax1, ay1, ax2,
Time of Update: 2018-12-04
149. [USACO Dec07] 書架2★ 輸入檔案:shelf2.in 輸出檔案:shelf2.out 簡單對比時間限制:1 s 記憶體限制:128 MB譯 by CmYkRgB123Farmer John最近為奶牛圖書館購買了一個書架,書架的下層很快裝滿了書,現在只剩下了頂層書架有空間。在 N (1 ≤ N ≤ 20)頭牛中,第i頭牛的身高為 Hi (1 ≤ Hi ≤ 1,000,000)。書架的高度為 B (1 ≤ B ≤ 2,000,000,007),且 B
Time of Update: 2018-12-04
題意:輸入n,n為數的層數,然後輸入最底層的每個節點的葉子節點的值,輸入m條指令,從前端節點開始,0為向左,1為向右,最後輸出指令所要的字串思路:用數組類比,假設前端節點為1,之後每個節點的左右節點分別為2 * k,2 * k + 1#include<stdio.h> #include<string.h>#include<math.h>int main() {int n, m, t = 0;char s[100], str[150],
Time of Update: 2018-12-04
題目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=249又是推箱子。。題目求的是推箱子所要的最少次數。 那麼以箱子為開始點
Time of Update: 2018-12-04
/*思路:題目有點類似變形的約瑟夫環,不過感覺用鏈表做有些麻煩,所以用數組類比 剛開始每什麼思路,後來在網上看到了一個很好的思路,就理解了一下,自己敲代碼。 是這樣的,我們可以理解為在桌上有一堆撲克牌數量為n,按順序放好,然後從左數k張,拿掉,同時從右數m張,拿掉。當從左數到盡頭時, 要再從最左邊有牌的開始往右數,從右數的同左邊數的方法一樣。當桌上的牌拿光是結束。*/#include<stdio.h>int queue[25];void
Time of Update: 2018-12-04
代碼來自 演算法競賽入門經典。#include <cmath>#include <ctime>#include <iostream>#include <string>#include <vector>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>#include
Time of Update: 2018-12-04
題意:給出四個點,判斷兩條線段是否,相交(求交點),同一條直線,平行思路:首先判斷是否為同一條直線,利用三點共線,求p1 p2 p3 與p1 p2 p4是否同時共線其次判斷是否平行,利用(x1 - x2) * (y3 - y4) = (x3 - x4) * (y1 - y2)最後判斷就是求交點,假設相交的點p(x, y)那個交點與另外兩條線段的端點一定共線,所以可以得到兩個方程:(x1 - x)(y2 - y) - (y - y1)(x - x2) = 0, (x3 - x)(y4 - y) -
Time of Update: 2018-12-04
題目:http://acm.hdu.edu.cn/showproblem.php?pid=1465 f[n]=(f[n-1]+f[n-2])*(n-1)有N個信封的時候,可以考慮第N個信封本來是對的。則對於這個信封只有兩種選擇,一種是找一個錯的交換,一種是找另一個對的交換。找一個錯的信封交換即從n-1種排錯的信封中任取一封交換即f[n-1]*(n-1);另一種找n-1中唯一排對的信封與之交換,即(n-1)*f[n-2]。由於遞推資料很大,要用_int64#include
Time of Update: 2018-12-04
題意:匹配括弧思路:利用STL中的stack做的,記住Null 字元串也是Yes。#include<iostream>#include<cstdio>#include<cstring>#include<stack>#include<algorithm>using namespace std;int main() {int n;char s[150];scanf("%d", &n);getchar();while (n--)
Time of Update: 2018-12-04
Catalan數的解法Catalan數的組合公式為 Cn=C(2n,n) / (n+1);此數的遞迴公式為 h(n ) = h(n-1)*(4*n-2) / (n+1) 小數解對於50以下的小數解來說,使用數組就可以完成,代碼如下:#include<iostream>using namespace std;int main(){ long long int a[101][101],i,j,n; for (i=0; i<101; i++) //利用數組求
Time of Update: 2018-12-04
1 //a^b mod c=(a mod c)^b mod c很容易設計出一個基於二分的遞迴演算法。 2 #include<stdio.h> 3 #include<stdlib.h> 4 //快速冪演算法,數論二分 5 long long powermod(int a,int b, int c) //不用longlong就報錯,題目中那個取值範圍不就在2的31次方內 6 { 7 long long t; 8 if(b==0) return 1%c; 9