--------------
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;
}
--------------