Time of Update: 2018-12-03
Jvm的記憶體回收機制到底會不會回收掉長時間不用的單例模式對象,這的確是一個比較有爭議性的問題。將這一部分內容單獨成篇的目的也是為了與廣大博友廣泛的討論一下這個問題。為了能讓更多的人看到這篇文章,請各位博友看完文章之後,點一下“頂”,讓本篇文章排名盡量的靠前。筆者在此謝過。討論命題:當一個單例的對象長久不用時,會不會被jvm的垃圾收集機制回收。
Time of Update: 2018-12-03
首先這題是一道物理題,需要我們根據題意抽象一個函數出來。對物體的運動作分解後,可以得到:f(t)=x*tan(t)-g*x*x/(v*cos(t))^2/2,其中t表示v與x軸正向的夾角(弧度),f(t)表示物體的運動軌跡與直線x0=x的交點縱座標。分析後可以得到該函數在區間(0,π/2)上先增後減,所以我們可以在該區間上三分,求出使函數取得極大值的角度t0。若f(t0)<y,則無解;否則對區間(0,t0)二分,找到使得f(t)=y的t值,即為所求。#include<iostr
Time of Update: 2018-12-03
首先這道題不得不讓我吐槽下,測試資料太無語了,在輸入列和行後,後面竟然還會輸空格,所以不能用getchar()去處理'\n',只能用gets(),這樣一次性就可以處理掉空格和'\n'。
Time of Update: 2018-12-03
題意:給你兩個數字串,其中可以包含'?',求將兩個數字串變成不可比較的數字串有多少種方案。(不可比較若且唯若存在i,j,使得s[i]<w[i]&&s[j]>w[j])。題意理解清楚後,就知道這題其實就是一道排列組合的題目了。//排列組合#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=100005;const
Time of Update: 2018-12-03
這題注意精度就行,其時就是一個簡單的二分枚舉。#include<iostream>#include<cstdio>#include<cmath>using namespace std;const double eps=1e-4;double f(double x){ double X[4]={x}; for(int i=1;i<4;i++) X[i]=x*X[i-1]; return 8*X[3]+7*X[2]+2
Time of Update: 2018-12-03
題目意思為判斷某單詞是否以另一單詞為首碼,這是字典樹的典型應用,需要注意的部分已在代碼部分注釋。#include<iostream>#include<cstdio>#include<cstring>using namespace std;struct node{bool isTail;node *next[10];}memory[1000000],*root;int cur;node *build_node(){node
Time of Update: 2018-12-03
題意:給定兩個字串,求在主串中模式串出現的次數。#include<stdio.h>char A[1000005],B[10005];int next[10005];void getnext(){ int i,j; next[0]=0; for(i=1,j=0;B[i];i++) { while(j>0&&B[i]!=B[j]) j=next[j-1]; if(B[i]==B[j])
Time of Update: 2018-12-03
Time of Update: 2018-12-03
#include<iostream>#include<queue>#include<cstdio>#include<cstring>using namespace std;struct st{ int cur;//當前格局 int choose;//已選了哪幾個格子 int step;//步數}w,temp;const int res=((1<<16)-1);int
Time of Update: 2018-12-03
剛開始沒去深入挖掘題目的意思,因此一直在糾結題目中提到的黑屋子,其實仔細一想後,黑屋子只不過是為了改變出場順序而已,所以重點又回到了原來給定的那個順序上。想通這一點後,本題也就不難設計出狀態了。 dp(i,j)表是區間[i.j]中的人得到的最小不高興度,現在來分析第i個人,在他之前可以有k個人已經走上了舞台(此即黑屋子的巧妙用處),則狀態轉移方程為:dp(i,j)=min( dp(i,j),
Time of Update: 2018-12-03
這題挺悲催的,RE了十幾次,但最終被我發現了,哎,資料處理竟然出問題了。。。回到題目吧,這題因為要判斷在輸入第幾個語句後,是矛盾還是可以確定順序,所以不能一次建完樹,然後拓撲。我的做法是每輸入一條語句就在已建的樹上修改,然後拓撲一次,直到可以得到結論(此處我竟然直接break了,然後一直RE,真是低級的錯誤,以後一定引以為戒!)#include<iostream>#include<cstdio>#include<cstring>using
Time of Update: 2018-12-03
本題的行和列的範圍相差很多,因此很容易想到要用狀態壓縮。對於(i,j)位置,影響它能否放炮兵的因素有兩個:1.是否是平地 2.(i-1,j)或(i-2,j)處是否放有炮兵。至於與它同行的就不用考慮了,因為在設計演算法是可以很容易的避免同行的相互攻擊。所以我們必須要記錄i-1行和i-2行的放置炮兵的情況,首先很容易想到把第i-1行和i-2行分別按二進位位壓縮,但很快就把這種想法給否定了,因為這樣做的話所佔空間為
Time of Update: 2018-12-03
Time of Update: 2018-12-03
這道題看瞭解題報告後才懂的,第一次遇到這種變形的背包,不過真是很難想到要先按照Q-P排序。。。下面說一下我對本題的理解。 首先講一下暴力解決,很顯然我們可以用枚舉的方法,對每個物品都有選與不選兩種決策。但即使暴力也存在一個問題,比如對 3 5 6,5 10
Time of Update: 2018-12-03
一道簡單的hash,對於每個雪花將其六片花瓣的長度相加,然後模一個較大的質數,作為其hash值。若出現hash值相同的雪花,再判斷這兩片雪花是否相同(各片分別花瓣長度分別相同且相對位置相同) #include<iostream>#include<vector>#include<cstdio>#include<cstring>using namespace std;const int M=100001;struct{int
Time of Update: 2018-12-03
題意:給定一個字串,求該串長度為i的首碼的最大重複持續時間(前提是該首碼是迴圈串)。#include<stdio.h>#define N 1000005char s[N];int next[N],n;void getnext(){ int i,j; next[0]=0; for(i=1,j=0;i<n;i++) { while(j>0&&s[i]!=s[j]) j=next[j-1];
Time of Update: 2018-12-03
題意:給定一個串,求出該串的所有前尾碼的長度(包括該串本身)。/*感覺這道題就是求next數組的逆過程,但首先還是要求一遍next數組,得到最後一個元素的next值,然後再從最後一個元素開始根據next值往前推,直到next值等於0為止*/#include<stdio.h>#define N 400010char s[N];int next[N],len;void getnext(){ int i,j; next[0]=0; for(i=1,j=0;s[i];
Time of Update: 2018-12-03
這道題的資料範圍為1<=n<=10^5,若用普通的O(n^2)演算法肯定逾時,所以此處要用到最佳化後的LIS。但這題又不是單純的LIS,因為它加了一個限制條件。演算法思想:此題要用到一個附加數組c[i],其中c[i]表示長度為i的子序列的最小尾部,但因為此題有個限制條件:相鄰兩個數位距離大於d,因此在讀第i個元素時,c數組其實還只更新到i-d,這也就是處理此題的技巧了。 dp[i]:以第i號元素結尾的最長子序列c[i]:長度為i的子序列的最小尾部a[i]:集合元素#inclu
Time of Update: 2018-12-03
看到這道題,第一感覺就是區間dp,但重要的就是如何狀態轉移了。對於給定的串S,可分以下三種情況討論:1.S形如(S')或[S'],則只要把S'變成規則的就行;2.S形如(S'則只需將S'變成規則的,然後在右邊添上')';3.對於S形如S')或S']或[S',方法同上。對於任何一個串S,都可將它分成兩部分S1,S2,若S1,S2規則,則S也規則。說到這裡,狀態轉移方程基本就就出來了。#include<iostream>#include<cstring>using
Time of Update: 2018-12-03