Time of Update: 2018-12-07
UVA_10041這個題目是一個貪心的題目。如果設按升序排列的si的數組為s[],那麼Vito的位置一定為s[(r-1)/2]。對於這一點,我們分兩種情況進行討論:①如果si的數量為奇數,那麼Vito的位置一定取數組s[]中間的那個值s[(r-1)/2]。因為如果周圍的值和s[(r-1)/2]相同的話,Vito的位置左右移動不會產生影響,但如果周圍的某個值s[i]不和s[(r-1)/2]相同,倘若Vito的位置移到了這個值上面,可以計算得出,總距離至少增加了abs(s[i]-s[(r-1)/2]
Time of Update: 2018-12-07
UVA_10129這個題目我一開始把一個字串看成了一個點,這樣就相當於去找是否存在一條不經過重複頂點的路徑可以覆蓋所有頂點,但這麼去做的話會比較麻煩。後來想了一下,實際上可以把一個字串看成一條有向邊,26個字母是頂點,這樣就轉化成了找是否存在一條不經過重複邊的路徑可以覆蓋所有的邊,實際上就是找是否存在歐拉道路了。根據有向圖的歐拉道路的結論(劉汝佳白書P112),首先,圖必須是連通的,其次,最多隻有兩個點的入讀不等於出度,而且必須是一個點的入讀比出度大1,另一個點的出度比入讀大1。為了保證圖是連通
Time of Update: 2018-12-07
UVA_10801這個是一個求最短路的題目。首先我們用鄰接矩陣G[i][j]表示第i個電梯是否可以到第j層,然後便用隊列最佳化的Bellman-Ford演算法去求解最短路即可。需要注意的是,在求最短路時枚舉的必須是可以到達該點的電梯。同時,為了運算方便,我們可以假設第一次乘電梯時也需要等60s,最後再從結果中除掉這多餘的60s即可,但由於資料中存在k=0的情況,所以在除去60s時要加一個判斷。#include<stdio.h>#include<string.h>#incl
Time of Update: 2018-12-07
UVA_558 這個題目實際上就是在讓我們判斷原圖是否存在負圈,如果使用SPFA的話,當一個點的入隊次數大於N時,就可以說明原圖存在負圈了。#include<stdio.h>#include<string.h>#define MAXD 1010#define MAXM 2010#define INF 1000000000int d[MAXD], q[MAXD], inq[MAXD], inedq[MAXD];int N, M, first[MAXD], e,
Time of Update: 2018-12-07
問題描述:集合{1、2、3,…,n}無連續整數的子集個數。輸入:輸入檔案中有若干行。每一行上有一個正整數n一組測試資料,(1<£n<45)。輸入直到檔案結束。 輸出:對輸入檔案中的每組測試資料n,在輸出檔案輸出無連續整數的所有子集個數。輸入範例:348 輸出範例5855 打表實現
Time of Update: 2018-12-07
我一直都比較關注 功能項增、刪、改查許可權的解決方案 也看過園子裡一些園友的解決方案 可是一直都沒看到我期待的解決方案(也許是我沒看見) 前端時間看到一邊擴充的文章 頓時豁然開朗 想出了一種解決方案功能描述 如:菜單管理 路徑為:/Back/Menu 我需要為這個頁面根據角色或個人等設定 增、刪、改許可權 下面就以角色為例(需判斷多個取並集)我的解決方案: 首先用一個關係表 儲存菜單 菜單ID 角色ID 擁有許可權 1 1
Time of Update: 2018-12-07
最小公倍數Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14564 Accepted Submission(s): 7651Problem
Time of Update: 2018-12-07
升降交替數列問題描述有一種長度為n 的特殊數列,具有如下特點:(1)第一項為1;(2)每一項為1、2或3;(3)數列中的項升降交替。例如,長度為3 的特殊數列只有3條:121,132,131。你的任務是計算長度為n 的特殊數列的條數。輸入:輸入檔案有若干行,每行上有一個整數n,表示特殊數列長度,1≤n≤45。輸出:對輸入檔案中的每個整數n,輸出長度為n的特殊數列的條數
Time of Update: 2018-12-07
Eddy's digital RootsTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1609 Accepted Submission(s): 947Problem DescriptionThe digital root of a positive integer is found by summing the digits
Time of Update: 2018-12-07
UVA_146這個題目實際上就是要求產生下一個字典序排列。如果要是恰好比現在的字串大一點點的話,肯定是最後連續的幾位變動得越少越好,那麼不妨從後往前搜,直到後面一個字元要大於前面一個字元,這時從前面那個字元一直到字串末尾便是最小的變動區間。之後在這個區間裡找到恰好比首字元大一點的字元和首字元進行交換,然後將這個區間除首字元之外按字典序排列即可。#include<string.h>#include<string.h>#include<stdlib.h>char
Time of Update: 2018-12-07
POJ_2251 這個題目相比之前做過的BFS遍曆迷宮的問題,相當於增加了一維的空間,這樣在移動的時候就多了兩種選擇。#include<stdio.h>#include<string.h>int a[35][35][35],dis[35][35][35],vis[35][35][35];int qx[27010],qy[27010],ql[27010];int dx[]={-1,1,0,0},dy[]={0,0,-1,1};char b[50];int main()
Time of Update: 2018-12-07
HDU_4001 這個是一個相對容易的動態規劃題,由於每次activity的時候M一定是在上海的,因而要達到這個狀態,要麼從前一次activity結束一直到現在M一直在上海,要麼在上一次activity結束之後M飛回了北京,並在這次activity開始前一天飛到了上海(這種情況的前提是兩次activity之間的間隔時間大於或等於2天),在兩種情況中取一個花費最小的情況即可。#include<stdio.h>#include<string.h>int n,a,b,d[
Time of Update: 2018-12-07
UVA_10048 這個題目是在求所有可達路徑中最大值最小的一條路,並輸出去其最大值。由題目特徵,我們採用Floyd演算法求解會方便一些。#include<stdio.h>#include<string.h>int f[110][110];int main(){int i,j,k,n,t,C,S,Q,u,v,temp; t=0;while(scanf("%d%d%d",&C,&S,&Q)==3)
Time of Update: 2018-12-07
HDU_3879由於最終收益=所有可能收益-(損失的收益+架設費用),因此我們可以轉而用最小割去求損失的收益與架設費用之和。在建圖的時候源點與使用者相連,容量為每個使用者帶來的收益,架設點與匯點相連,容量為架設每個點所需的費用,之後將使用者需要的兩個點與該使用者相連,容量為INF。建好圖之後,左邊的流量就代表損失的收益,右邊的流量就代表架設費用之和,之後求此圖的最小割即可。#include<string.h>#include<stdio.h>#define MAXD 60
Time of Update: 2018-12-07
POJ_3076為了練一下自己對Dancing Links的熟悉程度,做了一下這個題目。由於對題目中的一句話理解沒有到位The program prints the solutionof the input encoded grids in the same format and order as used for input,導致最後輸出之間沒有空行。一定要注意審題呀!#include<stdio.h>#include<string.h>#define INF 1000
Time of Update: 2018-12-07
UVA_12299 這個是湖南省賽的題目,要是早點能學到YTQ後來給我PPT的話,當時也許就過掉了。 這個題目比一般的RMQ多了一個shift操作,用堆儲存線段樹然後直接自底向上更新一下即可。#include<stdio.h>#include<string.h>#include<ctype.h>#define MAXD 100010#define INF 1000000000int N, M, Q, tree[4 * MAXD];char b[50
Time of Update: 2018-12-07
Problem A 考察地形 題目中所描述的P即指任意兩點之間的所有最短路徑所覆蓋的不同的路的條數,最後要求求P的最大值。 一個比較直接、暴力的想法就是首先用Floyd處理出任意兩點i,j間的最短路,然後枚舉i、j,每次掃描一遍頂點確定在所有最短路中都有哪些頂點,即對k滿足f[i][k]+f[k][j]=f[i][j]。然後凡是最短路上的邊,必然是k的集合中的點所連成的邊,因此我們再一對一對枚舉k集合中的點x、y,並判斷兩點間的那條路是否在最短路上,即是否滿足f[i][x]+g[x]
Time of Update: 2018-12-07
UVA_10285 這個題目可以用記憶化搜尋實現,f[i][j]記錄的是周邊四個點可以深搜到的最大值加1。 枚舉一遍i、j並進行記憶化搜尋即可。#include<stdio.h>#include<string.h>#define MAXD 110char b[110];int N, M, a[MAXD][MAXD], f[MAXD][MAXD], max;int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};void
Time of Update: 2018-12-07
UVA_147 用dp進行計數即可,狀態轉移方程為f[i][j]=Sum{f[i][j-k*a[i]]}(j-k*a[i]>=0,k為整數),其中i代表第i種面值,j代表當前有j的cents,a[i]為第i種面值的大小。在遞推的時候,需要從小的面值向大的面值進行遞推。#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 6010int d[] = {1, 2, 4, 10,
Time of Update: 2018-12-07
UVA_10069 這個題目一開始沒有頭緒,後來看了一下別人的題解頓悟了。 我們不妨設短串是a,長串是b,用數組f[i][j]表示到b的第j位時一共包含了多少個a到第i位的子序列。這樣,動態轉移方程就是f[i][j]=f[i][j-1];if(a[i]==b[j]) f[i][j]+=f[i-1][j-1];,同時我們需要初始化i=0時f[i][j]的值,即統計一下b中到第j位時出現了多少個a[0]即可。 為了能偷懶,就直接用java的BigInteger去寫了。import