2018提高組模擬9

2021-08-28 16:55:58 字數 4422 閱讀 1184

2018提高組模擬9

—————————————————————————————————————————20181004

(woj4036)

【模擬||數論】

描述給定乙個k(2<=k<=16)進製數a,判斷a是否能被k-1整除。

輸入第一行是乙個整數t(1<=t<=50),表示測試點數量。

對於每組資料,第一行乙個整數k,表示進製。

第二行乙個k進製數,表示a。保證a是合法的k進製數,沒有前導0,且只由』0』-『9』、』a』-『f』構成。

輸出如果a可以被k-1整除,輸出」yes」,否則輸出」no」。

樣例輸入216

2d10

19樣例輸出

yesno

提示對於40%的資料,a的長度不超過5。

對於100%的資料,a的長度不超過100000。

像十進位制的除法的豎式一樣模擬就好了

當然還有一種神奇做法:

描述在成都某中學有m個男生與n個女生排隊,這個學校的女生比較古怪,從某個位置(包含這個位置)開始往前數,男生的數量超過了女生的數量,女生會感覺不安全,於是會大叫起來,為了構建和諧校園,安排隊伍時應該避免這樣的情況。請你計算出不會引發尖叫的排隊方案的概率。(排隊方案不同定義:當且僅當某個某個位置人不一樣,如男生a、男生b ,與男生b、男生a ,2個排列是不同方案)

輸入第一行1個整數, 表示測試資料的組數。

每個資料 有兩個數 n,m(n個女生,m個男生)

輸出對於每組資料,輸出乙個實數(保留到小數點後 6 位)

樣例輸入

31 0

0 11 1

樣例輸出

1.000000

0.000000

0.500000

提示【 hint】

第一組:只有乙個女生,一種方案且可行

第二組:只有1個男生,一種方案且不行

第三組:兩種方案 女、男可行,男、女不可行,可行概率0.5

【資料規模】

30%的資料: (測試組數<=10),(0<=n,m<=1000).

100%的資料: (測試組數=9008 ), ( 0<=n,m<=20000 ).

數學找規律

先打乙個暴利程式,然後小資料輸入看結果,很有規律的!!

暴力程式:

#include#includeusing namespace std;

inline int read()

return x;

}int t,a,b;

int dfs(int now,int g,int bo)

printf("%lf\n",1ll*dfs(1,0,0)*bb(a)*bb(b)*1.000000/bb(a+b));

} return 0;

}

正解**換方式很多)

可以將原問題轉化一下,看成是在乙個二維平面上行走,女生看成移動(1,0),男生看成移動(0,1),

那麼到達(n,m)點且路線又不走到y=x 這條直線上方的路線總數就是答案,

這個組合問題很經典,方案數為 c(m+n,m)-(m+n,m-1),所以可以知道答案就是1-m/(n+1) 

#include#includeusing namespace std;

inline int read()

return x;

}int t,a,b;

int main()

printf("%.6lf\n",(double)(a-b+1)/(double)(a+1));

} return 0;

}

(woj4038)

(tarjan無向圖邊雙連通分量+樹形dp)

描述l因為業務繁忙,經常會到處出差。因為他是航空公司的優質客戶,於是某個航空公司給了他乙個優惠券。

他可以利用這個優惠券在任何乙個國家內的任意城市間免費旅行,當他的路線跨國才會產生費用。l有乙個航空公司的**表與航線。而且每個城市出發都能到所有的城市,2個城市間可能有不止乙個航班,乙個國家內的2個城市間一定有不同的路線,但是不同國家的城市間只有一條路線。l想知道從每個城市出發到產生費用最多的城市,不過你不能重複在乙個航班上飛來飛去產生費用,必須沿最少的費用路線飛行

輸入第一行,兩個整數 n,m,表示n 個城市, m 條航線。

接下來 m 行,每行三個整數 a,b,c,表示城市 a,b 之間有一條費用為 c 的航線。

輸出共 n 行,第 i 行為從城市 i 出發到達每個城市額外費用的最大值。

樣例輸入

6 61 4 2

1 2 6

2 5 3

2 3 7

6 3 4

3 1 8

樣例輸出44

4677

提示【解釋】

有四個國家,包含的城市分別為 ,,,。

從城市 1 出發到達城市 6,乘坐(1,3)(3,6)兩個航班費用最大,(1,3)在國內為免費航班, (3,6)的費用為 4,所以從 1 出發的最大費用為 4。

【資料規模】

對於 40%的資料 1<=n<=1000,1<=m<=1000

對於 100%的資料 1<=n<=20000,1<=m<=200000

先用無向圖邊雙連通分量縮點,再用乙個樹形dp就好了

方案一:

兩次dfs/樹形dp求直徑的2個端點a,b,

則 x到最遠距離的距離是 max(dis(x,a),dis(x,b)) 

方案二:

樹形dp換根法

記錄每乙個點向下的最大值與次大值

對於每乙個點,需求的最大答案就是:

從父親走到自己的兄弟,或從父親走到自己的祖父,或由自己走到自己的兒孫

縮點,重新建邊後,不一定是樹

因為兩個國家中電的多個城市可能與另乙個國家的多個城市都有邊!!!!!!!!!!!!!!!!!

不過,vis陣列可以解決…………

~~~~(>_

~~~~(>_

~~~~(>_

#include#include#include#include#includeusing namespace std;

inline int read()

while(isdigit(c))

return x*f;

}struct edgee[400010],a[400010];

int first[20010],first2[20010],cnt=1,cn=0;

inline void add(int u,int v,int w)

inline void add2(int u,int v,int w)

int n,m;

int dfn[20010],low[20010],tot=0,vis[20010],dcc[20010],siz=0;

stacks;

void tarjan(int x,int in)

else if(i!=(in^1)&&vis[y])

} if(dfn[x]==low[x]) }}

int dis1[20010],dis2[20010],mx=0,roota,rootb,vis1[20010],vis2[20010];

void dfs1(int x,int fa)

dfs1(y,x); }}

void dfs2(int x,int fa)

dfs2(y,x); }}

void dfs3(int x,int fa)

}int ans[20010];

int main()

tarjan(1,0);

for(int i=2,u,v;i<=cnt;i++)

dfs1(1,0);

mx=0;dis1[roota]=0;

memset(vis1,0,sizeof(vis1));

dfs2(roota,0);

dfs3(rootb,0);

for(int i=1;i<=siz;i++)

dis1[i]>dis2[i]?ans[i]=dis1[i]:ans[i]=dis2[i];

for(int i=1;i<=n;i++)

printf("%d\n",ans[dcc[i]]);

return 0;

}

NOIP提高組模擬賽9

考場跑了個dijstra就跑路,然後t了。其實dij用處不大,這題用bfs說不定還快點。但是直接大力bfs顯然同樣會t飛,考慮如何優化,問題的關鍵在於這張 圖 的 邊數 太多了,但是在bfs或者其他演算法dij中,每個點第一次被訪問就是該點的答案,也就是說,雖然我們多次掃到同乙個點,但真正有意義的只...

NOIP2018提高組模擬9 18

3對於 10 的資料,保證 n 5 對於 40 的資料,保證 n 10 對於 70 的資料,保證 n 500 對於 100 的資料,保證 n le 10 7,1 le s i le n 方法1 列舉每個任務選擇,再列舉所有的三元組。期望得分40 方法2 可以發現展開 frac frac frac t...

5845 NOIP2018提高組模擬 西西算數

西西是可愛的孩子,他總是喜歡算數,每天都在算啊算啊 這天,西西學會了如何進行指數運算,於是他算出了 5 2.2360679774997896964091736687313 然後他又算出了 3 5 2 27.4164079 3 5 5 3935.73982 西西頓時對 3 5 n產生了濃厚的興趣。但對...