(stone.cpp/c/pas)
一年一度的「跳石頭」比賽又要開始了!
這項比賽將在一條筆直的河道中進行,河道中分布著一些巨大岩石。組委會已經選擇好了兩塊岩石作為比賽起點和終點。在起點和終點之間,有 n 塊岩石(不含起點和終點的岩石) 。在比賽過程中,選手們將從起點出發,每一步跳向相鄰的岩石,直至到達終點。
為了提高比賽難度,組委會計畫移走一些岩石,使得選手們在比賽過程中的最短跳躍距離盡可能長。由於預算限制,組委會至多從起點和終點之間移走 m 塊岩石(不能移走起點和終點的岩石) 。
對於 20%的資料,0 ≤ m ≤ n ≤ 10。
對於 50%的資料,0 ≤ m ≤ n ≤ 100。
對於 100%的資料,0 ≤ m ≤ n ≤ 50,000,1 ≤ l ≤ 1,000,000,000。
你看那個l那麼大,如果暴力列舉,迴圈一遍都不行。很明顯要減少石頭之間的大量沒用距離的運算。
利用二分的思想,(二分答案),加上一點點貪心,就是兩個石子盡可能靠近。
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int n=50000;
int l,n,m,maxn,minn,ans,line[n+5];
int find(int x)
int main()
printf("%d",ans);
return
0;}
(substring.cpp/c/pas)
有兩個僅包含小寫英文本母的字串 a 和 b。 現在要從字串 a 中取出 k 個 互不重
疊 的非空子串, 然後把這 k 個子串按照其在字串 a 中出現的順序依次連線起來得到一
個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意:子串取出
的位置不同也認為是不同的方案 。
對於第 1 組資料:1≤n≤500,1≤m≤50,k=1;
對於第 2 組至第 3 組資料:1≤n≤500,1≤m≤50,k=2;
對於第 4 組至第 5 組資料:1≤n≤500,1≤m≤50,k=m;
對於第 1 組至第 7 組資料:1≤n≤500,1≤m≤50,1≤k≤m;
對於第 1 組至第 9 組資料:1≤n≤1000,1≤m≤100,1≤k≤m;
對於所有 10 組資料:1≤n≤1000,1≤m≤200,1≤k≤m。
首先,一般來說,字串的題不是用純的字串方法,就是用動態規劃。
這道題如果用純的字串方法,kmp找匹配然後在求組合數?求字尾?很明顯不是。再看看這明顯的「動規套路」,就知道這是dp了。可以用三維陣列,dp【a第i位】【b第i位】【分成p組】,然後兩個動規。我用的是乙個四維的陣列dp【a第i位】【b第i位】【分成p組】【子串是否存在於b中】,然後三個迴圈內一起搞就好了。
這裡要注意了,上述演算法是沒有正確性上的問題的,時間複雜度也沒有問題。但是由於記憶體的原因,陣列不可以開大了,所以要滾動,滾動第一維。可以用&,也可以%,反正把記憶體降下去了。
#include
#include
#include
const int mod=1000000007;
const int n=210;
using namespace std;
int n,m,p,s,f[2][n][n][2];
char a[n*5],b[n];
int main()
for(int j=1;j<=m;j++)
for(int k=1;k<=p;k++)
f[(i+1)%2][j][k][1]=f[(i+1)%2][j][k][0]=0;
}printf("%d\n",(f[n%2][m][p][0]+f[n%2][m][p][1])%mod);
return
0;}
(transport.cpp/c/pas)
公元 2044 年,人類進入了宇宙紀元。
l 國有 n 個星球,還有 n-1 條 雙向 航道,每條航道建立在兩個星球之間,這 n-1 條航道 連通 了 l 國的所有星球。
小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如:有一艘物流飛船需要從 u i 號星球沿 最快 的宇航路徑飛行到 v i 號星球去。 顯然, 飛船駛過一條航道是需要時間的,對於航道 j,任意飛船駛過它所花費的時間為 t j ,並且任意兩艘飛船之間 不會 產生任何干擾。
為了鼓勵科技創新,l 國國王同意小 p 的物流公司參與 l 國的航道建設,即允許小p 把某一條航道改造成蟲洞,飛船駛過蟲洞 不消耗 時間。
在蟲洞的建設完成前小 p 的物流公司就預接了 m 個運輸計畫。在蟲洞建設完成後,這 m 個運輸計畫會 同時開始,所有飛船 一起 出發。當這 m 個運輸計畫 都完成 時,小 p 的物流公司的階段性工作就完成了。
如果小 p 可以 自由選擇 將哪一條航道改造成蟲洞,試求出小 p 的物流公司完成階段性工作所需要的最短時間是多少?
我不會。。。**抄的
#include
#include
#include
#define n 300010
using namespace std;
intread()
return
x*f;
}struct edgee[n*2];
struct qedgeqe[n*2];
int n,m,i,j,q[n],efree,x,y,z,l,r,w,dfsx[n],mid,d[n],ans,ff[n],s[n],f[n],qq[n],qefree;
int max(int
x,int
y)void add(int
x,int
y,int z)
void qadd(int
x,int
y)void dfs1(int
x,int
y,int z)
int gf(int
x)void tarjan(int
x) for(int i=qq[x];i;i=qe[i].next)
if(f[qe[i].d])qe[i].lca=gf(qe[i].d);
}bool pd(int
x) }
for(i=1;i<=n;i++)s[ff[dfsx[i]]]+=s[dfsx[i]];
for(i=1;i<=n;i++)
if(s[i]==total)ans=max(ans,d[i]-d[ff[i]]);
return ans>=now;
}int main()
for(i=1;i<=m;i++)
dfs1(1,0,0);
tarjan(1);
while(l<=r)
printf("%d",ans);
}
NOIP2015 Day2 運輸計畫
公元 2044 年,人類進入了宇宙紀元。l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物流飛船需要從 ui 號星球沿最快的宇航路徑飛行到 vi 號星球去...
TJOI2015 Day2解題報告
在一棵n 10 5的樹上要求支援 從a點走到b點,求最大的value j value i 其中i,j是點,i在路徑中出現的位置先於j。將a b路徑上每個點的value加上v。自然可以用樹鏈剖分 lct做。每一段區間存四個數 後減前 型的最大值fmx,前減後 型的最大值bmx 這是由於有時候區間可能會...
NOIP2017 提高Day2 2 寶藏 解題報告
參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 n 個深埋在地下的寶藏屋,也給出了這 n 個寶藏屋之間可供開發的 m 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發寶藏屋之間的道路 則相對容...