Time of Update: 2018-12-05
這道題剛開始糾結於輸入,還是題刷少了。囧!本來想用strchr函數和指標來操作的,但是在輸入的時候很糾結,就放棄了。這是poj 2255的加強版,不用真正的建樹後在遍曆,直接類比建樹的過程就解決了。 下面是代碼: #include<stdio.h>#include<string.h>#define MAXN 10010int ans,flag,n;int s1[MAXN],s2[MAXN];int find_root(int b1,int e1,int
Time of Update: 2018-12-05
題目大意:就是先建兩個樹,然後遍曆這兩個樹。我就叫這種樹為四叉樹吧。難住我的地方就是遞迴建樹,然後是遍曆的時候想多來。具體的看代碼的注釋吧。下面是代碼:#include<stdio.h>#include<string.h>#include<iostream>#define MAXN 100000using namespace std;char s1[MAXN],s2[MAXN];char *s;typedef struct node{ node
Time of Update: 2018-12-05
題目描述:就是裸的最短路。但是在轉乘電梯的時候要耗時60s,同時從i到j層可以有不同的地奧體達到。題目分析:就是在建圖的時候注意一點,在Bellman-Ford的過程中改一下。下面是代碼:#include <cstdio>#include <cstring>#include <queue>using namespace std;const int INF = 1000000000;const int maxnn = 6;const int maxnk = 10
Time of Update: 2018-12-05
這道題用數組類比二叉樹,就可以來。#include<stdio.h>#define MAXN 1000int ord[MAXN];char s[MAXN],opera[MAXN],a[MAXN];int ans;int main(){ int n,m,T=0; //freopen("a.txt","r",stdin); //freopen("b.txt","w",stdout); while(scanf("%d",&n),n) {
Time of Update: 2018-12-05
分析:這道題蠻有意思的,雖然說很簡單,但是可以當做練手吧,鍛煉自己碼代碼的能力。注意:當a和b相等的時候,判定這個輸入不合法,不做任何的操作。#include<stdio.h>#include<string.h>#define MAXN 26int blocks[MAXN][MAXN];int n,order[MAXN],position[MAXN];void init(){ memset(blocks,-1,sizeof(blocks)); for(int
Time of Update: 2018-12-05
這道題出看思路很簡單,就是將能夠溝通的人合并都一起,但是判斷兩個人能不能溝通有點麻煩,所以在實現上出了點問題,一直沒解決。 我想的是先開個二維數組來直接儲存資訊(行儲存該人會的語言,列儲存的是該人),然後在搜尋的同時標記,可是感覺很難實現。看來下別人的代碼,根據一個二維數組,來建一個人與人之間能不能交流的二維數組,這樣直接就可以遍曆來。下面是代碼:#include<stdio.h>#include<string.h>#define MAXN 105int
Time of Update: 2018-12-05
這道題其實不難,就是輸出要求高一點的,結果我卻畫蛇添足,導致代碼很長,很雜亂,導致wa和pe。 題目分析:一看題就知道要開個數組,類比一個ring,那就直接用數組類比一個迴圈鏈表+刪除。就ok了。理解錯了output的有求導致wa了3次,pe2次。這裡有個小小的陷阱:如果要刪除的這個點剛好是另一個人有重新開始計數的點的話,那麼就向前或者後移一位。下面是代碼:#include<stdio.h>#define MAXN 22int queue[MAXN];int
Time of Update: 2018-12-05
/* 就是一些數字字串 ,怎樣排序讓組成的數字最大 貪心: 每次選兩個字串組成的數大的放在前面就行了 */ #include<stdio.h>#include<string.h>#include<iostream>using namespace std;//int str[55][1000];struct node{ char str[128]; // int len;}ss[57];bool cmp(node a,node b){
Time of Update: 2018-12-05
題目大意:從king Yertle邪惡王座下,趴出一個烏龜,(不過範例一king yertle的duke騎在了他的頭上),這隻烏龜只能怕到最上面去。就這樣,問趴出的最少的烏龜。 分析:最開始我的想法很簡單,但是是n的平方的複雜度,看了一下別人的想法,發現線性時間內搞定,但是為什麼我的時間相對於別人來說還是很長呢? 下面是代碼,想法很簡單,但是不好想到,一般的做法就是用qsort排序下載輸出。#include<iostream>#include<string>#
Time of Update: 2018-12-05
/*判斷一個有向圖是否有歐拉路只需判斷兩個條件: 一、將有向圖去掉方向,判斷其是否連通; 二、然後特判:最多隻能有兩個點的出度和入度可以不一樣,而且這兩個點中其中的一個點的入度大出度一,另一個點出度大入度一。關於證明現在證不到啊,這就是平時學習的時候忽略的地方。見lrj薄白書P112頁的結論吧。*/#include<cstdio>#include<cstring>using namespace std;const int maxn = 26;int in[maxn],
Time of Update: 2018-12-05
/*The analysis of this problem What is a Carmichael number? First it is not a prime; Second it must meet the contition that a^p mod p=a.*/#include<iostream>#include<cstdio>#include<cstdlib>//get a random
Time of Update: 2018-12-05
一、數論初步 1)、歐幾裡德演算法及其擴充 歐幾裡德演算法也叫輾轉相除法。根據gcd(a,b)=gcd(b,a%b)可以由遞迴寫出該演算法。 int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } 2)、素數相關 可用Eratosthenes篩法構造素數表。 void
Time of Update: 2018-12-05
這道題題目很長,想要弄清題意就得花點時間。當我第一次寫完代碼是發現,自己的代碼連最後一個範例都過不了。囧!題目還有一個規定,如果n包含了j和k,那麼j+k必須要小於n。如果沒有這個規定的話,只需要開一個數組,分別從前和從後向中間匹配就ok了。 仔細觀察,就會發現這道題就是括弧匹配的加強版。
Time of Update: 2018-12-05
題目大意:你的初始血量為100,每個房間的血量可能為負可能為正,每個房間允許重複通過。如果你的血量不大於0或者你不能跑到最後一個房間,那麼你就輸了。反之,你就贏了。分析:每個房間可以允許重複通過,這樣就可能存在一種可能,你的血量可以到達MAX!,這樣不管以後的房間中的血量為多少,你都可以通過!這就是這道題的痛點,如果沒用這個條件,這道題就可以很輕鬆的AC。如果想讓血量到達MAX,這有一個辦法,當你重複通過這個房間的時候,你的總血量再增加。但是,如何判斷你能否重複通過這個房間呢?因為是有向圖,所以
Time of Update: 2018-12-05
這道題先得到素數,然後用遞迴寫容斥就ok了,就是容易TLE! #include<stdio.h>#include<string.h>#define MAXN 1000005int prime[MAXN],flag[MAXN];int cnt=0;long long n;void get_prime(){ memset(prime,0,sizeof(prime)); memset(flag,0,sizeof(flag)); for(int i=
Time of Update: 2018-12-05
題目大意:從根結點開始標號,向左標號減一,向右標號加一。下面是代碼:#include<stdio.h>#include<string.h>#define MAXN 1000int ans[MAXN];int T;int build(int n,int num){ ans[n]+=num; int s; scanf("%d",&s); if(s!=-1) build(n-1,s); scanf("%d",&s);
Time of Update: 2018-12-05
剛開始寫題是有點想當然,自己感覺很簡單。可是在寫代碼的時候才發現自己的建樹方法很難實現。所以就在想有沒有更簡單的建樹方法。聯想到之前刷的括弧匹配的題,靈感就來了。orz,這道題關鍵就在如何建樹。下面是代碼: #include<iostream>#include<stack>#include<string>#include<cctype>#include<stdio.h>#define MAXN 10005using
Time of Update: 2018-12-05
題目大一:就是一個二叉樹建樹問題,很簡單,但是在兩個地方wa了,第一個地方是沒有看清題意,每次輸出需要列印一個斷行符號;第二個地方是yes需要大寫!orz,跪在這裡。。。下面是代碼:#include<iostream>#include<stdio.h>#define MAXN 1000using namespace std;bool flag;int build(){ int w1,d1,w2,d2; scanf("%d %d %d %d",&w1,&
Time of Update: 2018-12-05
分析:不同於一般的bfs,每個點有四種狀態,用思維數組vis[x][y][d][c]來表示遍曆的資訊。 剛開始時用下面的方法來bfs的: if( dx >= 0 && dx <M && dy >=0 && dy <N && map[dx][dy]) { if(!vis[dx][dy][i][color]) {
Time of Update: 2018-12-05
分析:因為這道題只給了兩種顏色,所以可以投機取巧的用bfs做,判斷用木有兩個結點的level相同。不過貌似就是這樣做,有Four Color Map Theorem,所以給了四種顏色絕對是可以滴。那麼就考慮三種顏色。現在木考慮到,誰能告訴我啊!(晚上回去想想吧,囧)下面是本題AC代碼:#include<cstdio>#include<cstring>using namespace std;const int maxn = 210;int