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產生了濃厚的興趣。但對...