Codeforces Round #105 (Div. 2) //缺E
--------------
A. Insomnia cure
---
求1~n中能被klmn整除的数的个数。
---
#include <iostream> using namespace std; int main() { int k,l,m,n,d; cin>>k>>l>>m>>n>>d; int sum=0; for (int i=1;i<=d;i++){ if (i%k==0||i%l==0||i%m==0||i%n==0){ sum++; } } cout<<sum<<endl; return 0; }
--------------
B. Escape
---
公主速度为Vp,龙速为Vd。
公主先出发t秒,每次被龙追上后,答案+1,龙返回起点休息f秒。
当公主和龙同时到达终点时不做处理。
观察公式
Vp*t+Vp*T1=Vd*T1
Vp*t+Vp*T1*2+Vp*f+Vp*T2=Vd*T2
............
龙从起点追上公主用时为 time=(公主当前所在位置)/(Vd-Vp)。
相遇地点为 meet=time*Vd
而公主在这个过程中(龙从起点出发到返回起点)移动了 time*2*Vp+f*Vp距离
---
#include <iostream> using namespace std; const double eps=1e-8; int main() { int vp,vd,t,f,c; cin>>vp>>vd>>t>>f>>c; if (vp>=vd){ cout<<0<<"\n"; return 0; } int ans=0; double pos=t*vp; while (pos+eps<c){ double time=pos/(double)(vd-vp); double meet=time*vd; if (meet+eps>=c) break; ans++; pos+=time*2.0*vp+f*vp; } cout<<ans<<endl; }
--------------
C. Terse princess
---
构造一个长度为n的数列。
有a个数比之前所有数都大。有b个数比之前所有数的和都大。
注意到可以有重复数字。
首先利用二进制的性质构造出 2^1,2^2,2^3....2^b
再添加2^b+1,2^b+2...2^b+a
最后补上1
---
#include <iostream> #include <vector> using namespace std; vector<int>ans; int main() { int n,a,b; cin>>n>>a>>b; if (b==0&&a>0){ if (a+b+1==n){ cout<<-1<<endl; return 0; } ans.push_back(1); n--; } ans.push_back(1); for (int i=1;i<=b;i++){ ans.push_back(1<<i); } for (int i=1;i<=a;i++){ ans.push_back((1<<b)+i); } for (int i=a+b+2;i<=n;i++){ ans.push_back(1); } for (int i=0;i<(int)ans.size();i++){ cout<<ans[i]<<" "; } cout<<endl; return 0; }
--------------
D. Bag of mice
---
Codeforces 148D - Bag of mice 概率dp
---
#include <iostream> #include <cstdio> #include <cstring> using namespace std; double f[1111][1111][2];//左白,右黑 bool vis[1111][1111][2]; double dfs(int w,int b,int turn) { if (vis[w][b][turn]) return f[w][b][turn]; double ret=0; if (turn==0) { if (w>=1) ret+=1.0*w/(w+b); if (b>=1) ret+=1.0*b/(w+b)*dfs(w,b-1,1); } else if (turn==1) { if (w>=1&&b>=1) ret+=1.0*b/(w+b)*1.0*w/(w+b-1)*dfs(w-1,b-1,0); if (b>=2) ret+=1.0*b/(w+b)*1.0*(b-1)/(w+b-1)*dfs(w,b-2,0); } vis[w][b][turn]=true; f[w][b][turn]=ret; return ret; } int main() { int w,b; scanf("%d%d",&w,&b); memset(f,0,sizeof(f)); memset(vis,0,sizeof(vis)); printf("%0.9lf\n",dfs(w,b,0)); return 0; }
--------------