Time of Update: 2018-12-05
題意:一頭奶牛沿著路標回家,求最短路徑。題解:注意處理重邊。感覺不錯,以後對於無向圖就用vector構圖,可以省去對重邊的處理。對於有向圖用記錄頭結點的邊的方式構圖。#include<cstdio>#include<queue>#include<cstring>using namespace std;#define MAX 10000#define INF 9999999struct Edge { int v, w, next; };Edge
Time of Update: 2018-12-05
題意:有N個客戶,M個倉庫,和K種貨物。已知每個客戶需要每種貨物的數量,每個倉庫儲存每種貨物的數量,每個倉庫運輸各種貨物去各個客戶的單位費用。判斷所有的倉庫能否滿足所有客戶的需求,如果可以,求出最少的運輸總費用。題解:因為 K 種產品互相不干擾,所以關鍵是把 K 種產品分開求解。#include <queue>#include <iostream>using namespace std;#define N 155#define INF 999999int need[N][
Time of Update: 2018-12-05
題意:讀題很噁心···。大概就是說現在有n個不同的插孔,m台不同的用電器,k種適配器。(適配器就相當於一個中間插座,比如一個適配器是(x,y)。有一台用電器必須插x插孔,但是現在只有一個y插孔,那麼就可以通過適配器來串連)。另外需要注意的就是給出的是適配器的種數,每一種的數量無限制。題解:建圖的大概思路。s-->電器-->適配器-->插孔-->t#include <queue>#include <cstring>#include
Time of Update: 2018-12-05
題意:有N個客戶,M個倉庫,和K種貨物。已知每個客戶需要每種貨物的數量,每個倉庫儲存每種貨物的數量,每個倉庫運輸各種貨物去各個客戶的單位費用。判斷所有的倉庫能否滿足所有客戶的需求,如果可以,求出最少的運輸總費用。題解:因為 K 種產品互相不干擾,所以關鍵是把 K 種產品分開求解。給出了兩種slack方式。#include <iostream>using namespace std;#define N 155#define INF 999999int need[N][N],
Time of Update: 2018-12-05
題意:幼稚園分糖果,輸入a,b,c表示,小孩a最多隻能忍受小孩b的糖果比他多c個。求第一個小孩和最後一個小孩最多可以相差多少個糖果。題解:卡隊列呀···。手寫了一個迴圈隊列果斷逾時。改成棧則AC。貌似還有許多最佳化的方法,比如用優先順序隊列或者堆。#include <iostream>using namespace std;#define N 150009int n, m;bool mark[N];int head[N], dis[N], Stack[N];struct Edge
Time of Update: 2018-12-05
題意:將n個小鎮串連起來,求最小產生樹。題解:#include <iostream>using namespace std;int t,n,father[501];struct path{int u,v,w;} edge[501 * 500 / 2];int cmp(const void *a, const void *b){return (*(path *)a).w - (*(path *)b).w;}int find_set ( int x ){if ( x != father[
Time of Update: 2018-12-05
題意:有一些關於點的資訊,大概如下。P A B C 表示點A在點B的北方且與B相距C。 V A B 表示點A在B的北方,但是不清楚具體的距離(A-B>=1)。題解:A-B=C轉換成A-B>=C和A-B<=C就可以了。#include <iostream>using namespace std;#define N 200005#define INF 99999999int n, m, size;bool mark[N];int head[N],
Time of Update: 2018-12-05
題意:套匯問題。問能否套匯盈利。題解:#include <cstring>#include <iostream>using namespace std;char cur[31][50];char str1[50], str2[50];double arb[31][31];int n,m;bool floyd (){int i,j,k;for ( k = 0; k < n; k++ ){for ( i = 0; i < n; i++ )for ( j = 0;
Time of Update: 2018-12-05
題意:F代表農場的個數,N代表每一個農場裡的地區數,M代表串連任意兩個地區的邊數,W代表蟲洞的數量。John喜歡時光旅行,在他的農場裡有許多地區,地區之間被一些正權的邊和一些負權的蟲洞串連。判斷John能否在地區之間實現時光旅行。題解:即判斷有無帶負權的環存在。#include<cstdio>#define INF 100000000#define MAX 10000struct Edge { int u, v, w; };Edge edge[MAX];int d[MAX], E,
Time of Update: 2018-12-05
題意:出於競爭目的,股票經紀人要在他們的人際關係網中傳播一些謠言。但是每個股票經紀人只能傳他給他所熟悉的幾個人。當謠言從第一個人傳出後,最快經過多多長時間最後一個人可以收到謠言。題解:通過Floyd求出任意兩個人之間的cost。然後分析一下即可。#include <iostream>using namespace std;#define INF 200000000int contract[101][101], n;void Floyd (){int i,j,k;for ( k = 1
Time of Update: 2018-12-05
題意:能否通過套匯盈利。題解:#include <iostream>using namespace std;double dist[210], v;int n, m, s;struct item{int a, b;double r,c;} node[210];bool Bellman_ford (){int i, j;memset(dist,0,sizeof(dist));dist[s] = v;for ( i = 1; i < n; i++ ){for ( j = 1; j
Time of Update: 2018-12-05
題意:湖中以許多石頭,其中一塊石頭上有一隻青蛙Freddy, 他想通過在石頭上跳躍去拜訪另一隻青蛙Fiona。求Freddy至少要能跳多遠才能到達Fiona所在的石頭。(Freddy在石頭1上,Fiona在石頭2上)題解:#include <cmath>#include <iomanip>#include <iostream>using namespace std;struct{double x, y;} stone[201];double d[201][20
Time of Update: 2018-12-05
題意:求資訊從第一個點發送至其他所有點所需的最小時間。以下三角的形式輸入,若不能從 i 傳至 j, 則用x表示。題解:需要注意輸入。#include <iomanip>#include <iostream>using namespace std;#define INF 200000000int map[101][101], n;int mark[101], dist[101];int Dijkstra (){int i, j, k, min,
Time of Update: 2018-12-05
仿照:http://www.2cto.com/kf/201106/92643.html題意:給出兩種操作:ADD(x),將x添加到有序列表中;GET()返回全域迭代器所指的值,其中迭代器在GET操作後會自添加1題解:大頂堆和小頂堆。 其中,對於序列S[1..n],及表示迭代器位置的index,大頂堆維護排序後的S[1..index-1],小頂堆維護排序後的S[index..n],例如S[1..n] = 1,2,3,4,5,6,7,index = 4,則大頂堆為{1,2,3},小頂堆為{4,
Time of Update: 2018-12-05
題意:沒什麼好說的,不過因為沒看清題,輸出大寫的YES,NO,貢獻了兩次,淚流滿面。函數strlen不要寫在迴圈內就OK了。否則會耗去大半時間。題解:#include <iostream>using namespace std;#define N 100010char str1[N], str2[N];int main(){while ( scanf("%s%s",str1,str2) != EOF ){int l1 = strlen(str1), l2 = strlen(str2)
Time of Update: 2018-12-05
題意:給定一個字串,如 str : ababab, 則 str = ab ^ 3, 輸出3。 又如 abcd, 輸出 1。題解:next 函數的應用, 理解並記住。#include <iostream>using namespace std;#define N 1000005char str[N];int next[N], n;void get_next ( int n ){int i = 0, j = -1;next[0] = -1;while ( i < n ){if (
Time of Update: 2018-12-05
第一次寫Trie樹,完全抄的模板。#include <iostream>using namespace std;const int kind = 26;struct Treenode{int count;Treenode *next[kind];Treenode (){count = 1;for ( int i = 0; i < kind; ++i )next[i] = NULL;}};void Insert ( Treenode *&root, char *word
Time of Update: 2018-12-05
題意:給你一系列互不相同的電話號碼,若存在某個號碼是其他某個號碼的首碼,則輸出不相容(NO), 否則輸出相容(YES)。#include <iostream>using namespace std;const int kind = 10;//代表字元種類,共10個,1,2,3,4,5,6,7,8,9,0.int cnt; //統計已經被佔用的節點的gstruct Treenode{bool flag;/*標記是否為電話號碼的最後一個數字,若是flag=1*/Treenode
Time of Update: 2018-12-05
題意:一群學生去城市的各個車站發邀請函,每個車站恰有一個學生。任意兩個車站之間都可達,並且有一個特定的車費。假如學生們早上都從車站1出發,晚上從各個車站回到車站1,求總的最小花費。題解:人生第一道Spfa。題意很明確,求帶權最短路徑。回來的時候反向建圖即可。#include <queue>#include <iostream>using namespace std;#define N 1000001#define INF 1999999999struct
Time of Update: 2018-12-05
題意:按字典序輸入一系列單詞,輸入結束後,判斷哪些單詞是由其餘兩個單詞串連而成。若是,則輸出(輸出也按字典序)。#include <iostream>using namespace std;char list[50001][26];const int kind = 26;int cnt = 0;struct Treenode{bool flag;Treenode *next[kind];Treenode(){flag = false;for ( int i = 0; i <