Topcoder SRM 547 Div1 250

Problem

On a horizontal line, there are two vertical pillars. The distance between their bottoms is w. The height of the first pillar is an integer, chosen uniformly at random in the range 1 through x, inclusive. The height of the second pillar is an integer, chosen uniformly at random in the range 1 through y, inclusive. The tops of both pillars will be connected by a straight piece of rope.

You are given the ints w, x, and y. Compute and return the expected length of the rope.

Limits

TimeLimit(ms):2000

MemoryLimit(MB):64

w∈[1,1000]

x,y∈[1,105]

Solution

枚举绳子的长度L,统计期望。

EXP=∑iLi×Nitotal,其中Ni表示不同绳子长度出现的次数,total表示总次数,total=x×y

发现L=w2+dh2 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄√,其中dh=abs(h1?h2),表示两个杆子高度的差值。因此,枚举dh即可。

下面需要处理Ni。对于不同的h1,与h2的差值dh是一段或两段连续的区间,因此只需要在这段区间上的Ni+=1即可。用两个标记数组,先标记最后统计的方法,可以在O(max(x,y))的时间内算出Ni

Complexity

TimeComplexity:O(max(x,y))

MemoryComplexity:O(max(x,y))

My Code

//Hello. I‘m Peter.
#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<cctype>
#include<ctime>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
typedef long double ld;
#define peter cout<<"i am peter"<<endl
#define input freopen("data.txt","r",stdin)
#define randin srand((unsigned int)time(NULL))
#define INT (0x3f3f3f3f)*2
#define LL (0x3f3f3f3f3f3f3f3f)*2
#define gsize(a) (int)a.size()
#define len(a) (int)strlen(a)
#define slen(s) (int)s.length()
#define pb(a) push_back(a)
#define clr(a) memset(a,0,sizeof(a))
#define clr_minus1(a) memset(a,-1,sizeof(a))
#define clr_INT(a) memset(a,INT,sizeof(a))
#define clr_true(a) memset(a,true,sizeof(a))
#define clr_false(a) memset(a,false,sizeof(a))
#define clr_queue(q) while(!q.empty()) q.pop()
#define clr_stack(s) while(!s.empty()) s.pop()
#define rep(i, a, b) for (int i = a; i < b; i++)
#define dep(i, a, b) for (int i = a; i > b; i--)
#define repin(i, a, b) for (int i = a; i <= b; i++)
#define depin(i, a, b) for (int i = a; i >= b; i--)
#define pi 3.1415926535898
#define eps 1e-6
#define MOD 1000000007
#define MAXN
#define N 100100
#define M
ll add[N],sub[N],res[N];
class Pillars{
public:
    double sq(double x){
        return x*x;
    }
    double getExpectedLength(int w, int x, int y){
        repin(i,0,max(x,y)){
            add[i]=sub[i]=res[i]=0;
        }
        int from=0,to=0;
        repin(h1,1,x){
            from=max(1,h1-y);
            to=h1-1;
            if(from<=to){
                add[from]+=1;
                sub[to]+=1;
            }
            if(y>=h1) res[0]+=1;
            if(y>h1){
                from=1;
                to=y-h1;
                add[from]+=1;
                sub[to]+=1;
            }
        }
        ll now=0;
        repin(i,1,max(x,y)-1){
            now+=add[i];
            res[i]=now;
            now-=sub[i];
        }
        double ans=0.0;
        repin(i,0,max(x,y)-1){
            double t=sqrt(sq(w)+sq(i));
            ans+=res[i]*t;
        }
        ll sum=(ll)x*(ll)y;
        ans/=sum;
        return ans;
    }
};
时间: 2024-10-07 00:12:03

Topcoder SRM 547 Div1 250的相关文章

Topcoder SRM 643 Div1 250&lt;peter_pan&gt;

Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*......*pn,我们假设p0,p1,...,pn是单调不降的,那么v里存储的是下标为偶数 的N的质因数p0,p2,p4,...,p(2k).现在要求写一个程序,返回一个vector<long long>ans; ans里存储的是p0,p1,p2,...,pn. Limits Time Limit(m

Topcoder SRM 648 Div1 250

Problem 给一个长度为N的"AB"字符串S,S只含有两种字符'A' 或 'B',设pair(i,j)(0=<i<j<N)表示一对 i,j 使得S[i]='A',S[j]='B'.现给定一个K,求字符串S,使得pair(i,j)的个数恰好为K.若不存在,则返回空串. Limits Time Limit(ms): 2000 Memory Limit(MB): 256 N: [2, 50] K: [0 , N*(N-1)/2 ] Solution 若K>(N/2

Topcoder SRM 345 Div1 250

题意:起初在(0,0),要到(x,y)去,每次只能横向或纵向移动.横向移动时,若所在直线y为偶数,那么只能往x轴正方向移动,若为奇数,只能往x轴反方向移动:纵向移动时,若所在直线x为偶数,那么只能往y轴正方向移动,若为奇数,只能往y轴反方向移动.问从起点到终点的最短距离是多少? x,y 范围是[-1e6, 1e6] 解法:一开始想到bfs(想到很自然),将(0, 0), (x, y), (x, 0), (0, y)这4个点分别周围9个点(包括自己)作为可达点.bfs处理出(0, 0)到(x, y

Topcoder SRM 653 Div1 250

Problem N个人坐成一排,属于同一个公司的人都坐在一起(挨在一起),但不知道谁属于哪个公司.现在问其中的某些人 他属于哪个公司,他的回答是Ai,Ai=0表示此人未被询问,否则表示他的回答.题目保证一定存在一种分组方案使得属于同一公司的人都坐在一起.现问方案是否唯一? Limits TimeLimit(ms):2000 MemoryLimit(MB):256 N,Ai∈[1,100] Solution 设dp[i]表示从i位置开始往后分组的情况,dp[i]=0表示无法分组,dp[i]=1表示

Topcoder SRM 488 Div1 250(概率dp)

题意:有n个有聊人和m个无聊人,每次等概率任选两个人,让他们都变成无聊人,求所有人都变成无聊人的期望次数.(1≤n,m≤47). 解法:设f(i)表示存在 i 个有聊人,将所有人都变成无聊人的期望次数.显然f(0) = 0,即不需要改变.方程:f(i)=f(i?2)×C2iC2n+m+f(i?1)×i×(n+m?i)C2n+m+f(i)×C2n+m?iC2n+m+1. 答案即为f(m) 代码 #include<cstdio> #include<algorithm> #include

Topcoder SRM 320 Div1 250

题意:给两个大整数,判断哪个更大.大整数以"AB"形式给出,"A"是一个不含前导0的整数(大于0,不超过1e9),"B"是若干个(可能为空)阶乘符号("!").比如:3!!=6!=720 解法:设两个大整数形式A部分分别为a,b:B部分分别有n1,n2个符号.假设n1 > n2,那么我们只需判断aA 和 b的大小即可,其中A为(n1 - n2)个阶乘符号.n1 = n2 或者 n1 < n2时候类似.但要注意有坑,

Topcoder SRM 564 Div1 250

题意:给一个n*m的棋盘,自己选择一个位置(x,y),放置一个马,马可以走到(x-1,y-1),(x-1,y-2),(x-1,y+1),(x-1,y+2),(x+1,y-1),(x+1,y-2),(x+1,y+1),(x+1,y+2) 八个位置,前提是不能走出棋盘.马可以永不停息地走.问马能走到的不同位置数最多是多少? 解法:如果n>m,swap(n,m):如果n=1,ans=1,如果n=2,ans=(m+1)>>1:如果n=3且m=3,ans=8:其他情况ans=n*m: 具体为啥,还

Topcoder SRM 392 Div1 250

题意:给两个字符串A,B,A和B都含有小写英文字母,同时都额外含有且仅含有一个字符 ?,现希望将A,B中的字符 ? 分别替换成其它字符串(可以不同,可以相同,可以为空),使得A=B,且要求最终的A, B串(A=B)最短.或者输出不可能. 解法:让A串作为?号更靠前的串,如果A的?号之前的字符存在一个与B对应位置不同,则不可能,如果B的?号之后的字符存在一个与A对应位置不同,则不可能.否则一定有解,暴力找到最优解即可.这题可以用hash或extend-kmp的方法,达到复杂度O(N)级别,但实现有

Topcoder SRM 652 DIV1 250

题意:大概是求前n个数的最大公倍数. 解题思路:筛法+质因子分解,敲玩就去睡觉了,没想到没优化被cha了... 解题代码: 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "ThePermutationGame.cpp" 7 #include <cstdlib> 8 #include <cctype> 9 #include <cstring> 10 #include <cs