Time of Update: 2018-12-05
貪心,從第一個給定的字串開始,每次都選取與前一個字串的首碼最大匹配的字串為下一個字串,以此類推。代碼如下:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<cmath>#include<ctime>using namespace std;struct group{ char w[102]; int num;};
Time of Update: 2018-12-05
本來以為是比較簡單的一個題,結果是理解錯題意了,本以為題意是相鄰的三個數不能為等差數列,結果WA了,看了其他人的代碼才知道題目的意思是不相鄰的只要是一個方向的也不能為等差數列。這樣難度就比較大了,思考了半天也沒想出什麼好辦法來,參考了他人的代碼,基本思路是用遞迴將序列不斷分為奇偶序列(按位置分),然後在合并,直到不能分為止,得到的便是沒有等差子序列的排序。代碼如下:#include<iostream>#include<cstdlib>#include<cstring
Time of Update: 2018-12-05
最大連續和問題,注意其還有一要求是需要路徑最長,即:當其和相同時,取路程最大的一段路的起點和終點,也就是說如果其和相同但其路徑較短則不必更新先前儲存的起點與終點位置。代碼如下:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<cmath>#include<ctime>using namespace std;int
Time of Update: 2018-12-05
對於a2+b2=c2,求出所有滿足條件的(a,b,c)三元組,輸出a,b,c三個互質的組別的數量和從1到N中所有的三元組中都沒有出現過的數位個數。要求互質畢達哥拉斯三元組,可直接得到:a = m^2-n^2 b = 2mn c = m^2+n^2因為三個變數之間兩兩互質,所以a,b中必為一奇一偶。(詳細證明見:http://www.cnblogs.com/devymex/archive/2010/08/07/1799713.html)因此問題的複雜度就可以降為O(m*n),即:最壞1
Time of Update: 2018-12-05
“最大值最小化”問題,先二分求最大值,再貪心實現按最左邊區間最小的格式輸出 。代碼如下:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<cmath>using namespace std;int main(){#ifdef test freopen("in.txt", "r", stdin);#endif int a[5
Time of Update: 2018-12-05
Treasure HuntingTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1321 Accepted Submission(s): 403Problem DescriptionZstu_yhr is a very curious person who fell in love with math when he was in
Time of Update: 2018-12-05
整數化小數,不迴圈的小數容易化。對於迴圈小數化分數原理如下:⑴ 把0.4747……和0.33……化成分數。例1: 0.4747……×100=47.4747…… 0.4747……×100-0.4747……=47.4747……-0.4747……(100-1)×0.4747……=47即99×0.4747…… =47 那麼 0.4747……=47/99例2: 0.33……×10=3.33……0.33……×10-0.33……=3.33…-0.33…… (10-1) ×0.33……
Time of Update: 2018-12-05
有向圖的強連通圖分量,Tarjan演算法,模板題。代碼如下:#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<vector>#include<stack>using namespace std;const int Maxn = 10002;const int MAX = 10000
Time of Update: 2018-12-05
GCD & LCMTime Limit: 2 Seconds Memory Limit: 65536 KBGiven x and y (2 <= x <= 100,000, 2 <= y <= 1,000,000), you are to count the number of p and q such that:1) p and q are positive integers;2) GCD(p, q) = x;3) LCM(p, q) =
Time of Update: 2018-12-05
貪心問題,有兩種最優方式,一種是最小次小走與最大次大走輪流的搭配,另一種是最小最大一塊走的搭配,需要一定的判定條件 ~在此給出兩種不同情況的資料第一種(範例):412510第二種:41345代碼如下:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<cmath>using namespace std;int cmp(const
Time of Update: 2018-12-05
字串水題,只要條件判全就能過。代碼如下:#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>using namespace std;bool Judge_Vowel(char ch){ if(ch=='a'|| ch=='e' || ch=='i' || ch=='o' || ch=='u')
Time of Update: 2018-12-05
比較坑爹的一個題,節點不一定為字母,而且可能為空白節點(需輸出“()”),除去這兩個地方比較噁心,個人感覺這還是比較好的一個樹的遞迴題。代碼如下:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>char a[200+2][200+2];int cct;void dfs(int x, int y){ int i, j, k; for(i = y;
Time of Update: 2018-12-05
純種的拓撲排序,參考劉汝佳《入門經典》上的代碼稍加修改,完全可以AC ~代碼如下:純種的拓撲排序,參考劉汝佳《入門經典》上的代碼稍加修改,完全可以AC ~代碼如下:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define max 100+5int c[max],topo[max],t,n,G[max][max];int dfs(int u){
Time of Update: 2018-12-05
題目大意:有1*1,2*2,3*3,...六種小包裹,往6*6的箱子裡裝,給出六種小包裹各自的數量,求出最少用的箱子的個數。貪心,思路還是比較簡單的,先從大的開始往小的裝。6*6的包裹,每個單獨裝一個箱子;5*5的包裹,可以和11個1*1的搭配;4*4的包裹,可以喝5個2*2的搭配;...以此類推(注意3*3的有四種搭配方案)。這裡可以每次優先用2*2的去填,如果2*2的為負了,再用1*1的補正,這樣可以簡化過程。最後如果1*1的數量為負,則不用處理(原因很簡單,在此不贅餘),若為正,則繼續裝。
Time of Update: 2018-12-05
先初始化,然後從後往前遍曆,遇到 ‘1’ 時,記下其下標f1,然後從f1-1的下標開始繼續往前遍曆,直到遇到第一個 ‘0’ ,記下其下標 f2,交換f1 與 f2對應的元素,然後將f2以後的元素按增序排列。迴圈直到,所有的 ‘1’在所有的‘0’前面時,即:f2 == -1時,結束。注意:是兩組元素之間有一個空行,而非每組元素後都有空行,因為這個地方WA了一次,竟然又在這種破地方栽了,哎,太不仔細了 ~~代碼如下:#include <stdio.h>#include
Time of Update: 2018-12-05
將整個映像放大兩倍後,其中間空格數恰好為所求空格數,注意整個映像外圈需要圍上一圈"#"號以作邊界;然後DFS 8個方向進行深度優先搜尋,這裡需注意,有對角線的四個方向需要特殊條件(判斷是否相通)才可遍曆,否則不遍曆 ~代碼如下:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define max 100+5int num,max_l,t,fflag,vis[
Time of Update: 2018-12-05
基本思路:已知目標線段[0,m],在所有給出線段左端點值小於目標線段左端點值的線段中,選出所對應右端點值最大的點,並用y的值不斷更新左端點的值,直到y值大於M,跳出。在做之前需要預先處理一下,將與目標線段無交集的線段全部濾去,並判斷給出的左右線段的最右值和最左值是否能將目標線段覆蓋。代碼如下:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<
Time of Update: 2018-12-05
求矩陣的最大子矩陣。代碼如下:方法一(普通方法效率較低,跑了1秒多):#include <iostream>#include <cstdio>using namespace std;int a[110][110] = {{0}};int main(){ int n, i, j, k, tmp, sum; while (scanf("%d", &n) == 1) { for (j = 1; j <= n; j++)
Time of Update: 2018-12-05
分解因子,從9開始分解,一直分解到2。0與1需要特殊處理。代碼如下:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<cmath>#include<ctime>using namespace std;int main(){#ifdef test freopen("in.txt", "r",
Time of Update: 2018-12-05
這道題是求最大子矩陣和的加強版,原矩陣是一個上下左右都可以串通的矩陣環,原方法是將原矩陣複製為四個,然後依次以n*n的矩陣為原型照搬最大子矩陣和的DP,但其複雜度為O(n5),交上後TLE,修改了若干變不是WA,就是TLE,最後,參考了結題報告,複製完矩陣後,枚舉所求最大子矩陣在第一個矩陣中的左上方,再通過動態規劃的方法求出長寬不大於N的最大子矩陣,各種枚舉情況中的最大和即為所求解。代碼如下:#include<iostream>#include<cstdlib>#incl