zoukankan      html  css  js  c++  java
  • 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem F. Judging Time Prediction 优先队列

    Problem F. Judging Time Prediction

    题目连接:

    http://www.codeforces.com/gym/100253

    Description

    It is not easy to predict. Do you know that the modern weather prediction is marginally better than to
    use the previous day weather as a prediction for the next day?
    This problem is about judging a submission on a programming contest like ACM-ICPC. Suppose there is
    a single submission for the problem containing n tests. Based on the previous statistics for each test we
    know ti  the expected time to judge on it and pi  the probability of a submission to pass the test.
    There are m judging machines in the system. They are completely independent and are used to judge a
    submission on multiple tests at the same time. They work as follows. Each time a judging machine has
    no task (has just started or nished processing the previous job), it chooses the unprocessed test with the
    smallest number and judges submission on the chosen test. If it was judged on the i-th test, then after
    time ti the verdict will be known. As it was written above, the probability that a submission passes the
    test is pi
    .
    Let's assume that the judging process starts at the same moment when all the judging machines start. So
    at this moment the rst min(m, n) tests start on the judging machines.
    You know that on ACM-ICPC contests it is not necessary to judge a submission on all tests. The judging
    process will be aborted at the rst moment when two conditions are met at the same time:
    • the solution was judged on some test (say, x) and didn't pass it,
    • the solution was judged on all the tests 1, 2, . . . , x − 1 and passed all of them.
    Naturally, if all the tests are judged and passed the judging process ends too.
    Write a program to print the expected time to judge a submission. It means that you are to nd the
    mathematical expectation of the judging time according to the specied model.

    Input

    The rst line of the input contains two integer numbers n and m (1 ≤ n ≤ 3 · 105
    , 1 ≤ m ≤ 3 · 105
    )  the
    number of tests and judging machines. The following n lines contain pairs of integers ti and real numbers
    pi (1 ≤ ti ≤ 100, 0 < pi < 1), where ti
    is the time required to judge the i-th test and pi
    is the probability
    to pass the i-th test. The values pi are given with no more than 4 digits after the decimal point.

    Output

    Print the only real number e  the expected time to judge the submission. Print it with at least 4 digits
    after the decimal point.

    Sample Input

    2 1
    1 0.5
    2 0.5

    Sample Output

    2.0000000000

    Hint

    题意

    有n组test,m个测评姬。

    每个空闲的测评姬,会找到当前序号最小,没有测评姬测的测试点进行测试。

    其中满足:

    1.x测试点wa了

    2.前面所有的测试点都测完了。

    这个测试就会结束。

    现在告诉你每个测评点需要的时间,以及通过的概率,问你期望测试时间。

    题解:

    拿一个优先队列,测出究竟是哪个测评姬测试这个测试点,以及这个测试点结束的时间。

    那么对于第i个测评点的贡献,就是前缀最大值乘上这个测试点挂掉的概率。

    代码

    #include <bits/stdc++.h>
    #define rep(a,b,c) for(int (a)=(b);(a)<=(c);++(a))
    #define drep(a,b,c) for(int (a)=(b);(a)>=(c);--(a))
    #define pb push_back
    #define mp make_pair
    #define sf scanf
    #define pf printf
    #define two(x) (1<<(x))
    #define clr(x,y) memset((x),(y),sizeof((x)))
    #define dbg(x) cout << #x << "=" << x << endl;
    const int mod = 1e9 + 7;
    int mul(int x,int y){return 1LL*x*y%mod;}
    int qpow(int x , int y){int res=1;while(y){if(y&1) res=mul(res,x) ; y>>=1 ; x=mul(x,x);} return res;}
    inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
    using namespace std;
    const int maxn = 3e5 + 500;
    int N , K , t[maxn] ;
    long long CompleteTime[maxn];
    double prefixp[maxn];
    double p[maxn];
    double prob = 1.;
    struct data{
        long long x ;
    	int index;
    	friend bool operator < ( const data & a , const data & b ){ return a.x > b.x; }
    	data( long long x , int index ) : x(x) , index( index ) {}
    };
    
    priority_queue < data > Q;
    
    
    int main(int argc,char *argv[]){
    	//freopen("in.txt" , "r" , stdin );
    	N = read() , K = read();
    	prefixp[0] = 1;
    	for(int i = 1 ; i <= N ; ++ i){
    		scanf("%d%lf" , t + i , p + i );
    		prefixp[i] = prefixp[ i - 1 ] * p[i];
    	}
    	for(int i = 1 ; i <= min( N , K ) ; ++ i){
    		Q.push( data( t[i] , i ) );
    	}
    	int ptr = min( N , K ) ;
    	double ans = 0;
    	while( !Q.empty() ){
    		data st = Q.top() ; Q.pop();
    		CompleteTime[st.index] = st.x;
    		++ ptr;
    		if( ptr <= N ) Q.push( data( st.x + t[ptr] , ptr ));
    	}
    	long long s = 0;
    	for(int i = 1 ; i <= N ; ++ i){
    		s = max( s , CompleteTime[i] );
    		ans += s * prefixp[i - 1] * ( 1. - p[i] ) ;
    	}
    	ans += s * prefixp[N];
    	pf("%.10lf
    " , ans);
    	return 0;
    }
  • 相关阅读:
    join命令
    参与者模式
    字符串中的第一个唯一字符
    Git与SVN对比
    惰性模式
    .NET Conf 2020
    使用Github部署Azure应用服务
    Azure Terraform(一)入门简介
    打日志还能打出个线上Bug_ 太难了。。。
    让API并行调用变得如丝般顺滑的绝招
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5775290.html
Copyright © 2011-2022 走看看