NOIP 2015 Day2 解題報告(全面)

2021-08-03 06:57:50 字數 3504 閱讀 1212

(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 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發寶藏屋之間的道路 則相對容...