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


--------------

posted on 2013-09-08 21:52  电子幼体  阅读(155)  评论(0编辑  收藏  举报

导航