zoukankan      html  css  js  c++  java
  • UVALive 6909 Kevin's Problem 数学排列组合

    Kevin's Problem

    题目连接:

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4921

    Description

    In his applied probability class, Kevin learned about the Secretary Problem.
    There are N applicants applying for secretary position in a company. The applicants are
    interviewed by a hiring manager one by one in arbitrary order. During the interview, the
    manager can rank the applicant’s quality uniquely relative to all applicants which have been
    interviewed so far, but he has no idea of the quality of applicants yet to be interviewed.
    The decision whether the manager should hire or reject the applicant must be done right
    after the interview ended (before he starts an interview with other applicant) and cannot be
    changed, i.e. once rejected, that particular applicant cannot be considered anymore. There
    is only one position available, so what is the best decision strategy for this problem?
    One reasonable strategy is: reject the first K applicants and hire the first remaining applicant who
    is better than all previous interviewed applicants, or hire the last one if there is no such applicant.
    Unfortunately, Kevin did not pay a full attention in his class. He misunderstood the strategy;
    instead of “. . . hire the first remaining applicant who is better than all previous interviewed applicants
    . . . ”, he thought it is “. . . hire the first remaining applicant who is better than the (immediate) previous
    interviewed applicant . . . ”. Let’s call this variation as Kevin’s strategy.
    Given N, K, and p determine in how many ways (interview order) such that the applicant whose
    rank is p among all applicants will be selected by Kevin’s strategy. For example, let N = 4, K = 2,
    and p = 2. Among all permutation of 1 . . . N, there are only 7 possible permutation such that the 2nd
    rank applicant is selected by Kevin’s strategy.
    • 1, 3, 2, 4 — 2 is selected because it’s better than 3.
    • 1, 3, 4, 2 — 2 is selected because 4 is worse than 3, and 2 is better than 4.
    • 1, 4, 2, 3
    • 3, 1, 4, 2
    • 3, 4, 2, 1
    • 4, 1, 3, 2
    • 4, 3, 2, 1
    Note that the first 2 applicants will not be hired in this example (K = 2). Clearly, the 2nd rank
    applicant will not be selected in any permutation where she appears in the first K.
    An applicant has a better rank if her rank is higher (smaller number), e.g. 2nd rank is better than
    5th.

    Input

    The first line of input contains an integer T (T ≤ 100) denoting the number of cases. Each case contains
    three integers: N, K, and p (2 ≤ N ≤ 500; 1 ≤ K < N; 1 ≤ p ≤ N) as explained in the problem
    description above.

    Output

    For each case, output ‘Case #X: Y ’, where X is the case number starts from 1 and Y is the number
    of permutation of 1 . . . N such that the p-th rank applicants is selected by Kevin’s strategy for that
    particular case. As this number could be very large, modulo Y by 1,000,000,007.
    Explanation for 3rd sample case:
    There are 5 applicants and Kevin’s strategy will reject the first 3. 5th rank applicant will be
    selected only if she is interviewed last, thus the manager has no choice but to hire her. Among 24
    possible permutations where 5th rank applicant appears last, only 12 permutations which make her
    hired:
    1, 2, 3, 4, 5 2, 1, 3, 4, 5 3, 1, 2, 4, 5 4, 1, 2, 3, 5
    1, 3, 2, 4, 5 2, 3, 1, 4, 5 3, 2, 1, 4, 5 4, 2, 1, 3, 5
    1, 4, 2, 3, 5 2, 4, 1, 3, 5 3, 4, 1, 2, 5 4, 3, 1, 2, 5
    Some examples where 5th rank will not be hired even though she is the last:
    1, 2, 4, 3, 5 – 3rd rank will be hired.
    1, 4, 3, 2, 5 – 2nd rank will be hired.
    3, 2, 4, 1, 5 – 1st rank will be hired.
    . . .

    Sample Input

    4
    4 2 2
    5 2 3
    5 3 5
    8 4 2

    Sample Output

    Case #1: 7
    Case #2: 26
    Case #3: 12
    Case #4: 7890

    Hint

    题意

    有一个公司,有编号为1~n,也是他们能力排名的人来应聘。

    公司准备只招一个人,他的招聘采用如下策略:

    先排除前k个人,然后再看,如果这个人比前一个人厉害,那就录取。

    如果没有人录取的话,那就录取最后一个人。

    问你有n个人,现在k个人排除,录取能力为p的人的方案数有多少种。

    题解:

    数学题,前面k个我们不用管,然后到第p个人,那么第p个人前面的应该是一个能力递减编号递增的序列,然后剩下位置就全排列。

    然后这样枚举p的位置,然后搞一波就好了。

    代码

    #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;
    #define lowbit(x) ((x)&(-x))
    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;
    
    inline void up(int & x ,int v){ x += v; if( x >= mod ) x -= mod; }
    /*
    dp(i , j , k , f)
    已经放了 i 个 , 有 j 个比 p 小的已经放了, k -> 前面一个放的是谁 , f 表示 p 放了没有
    */
    
    const int maxn = 500 + 15;
    int N,K,P,C[maxn][maxn],fac[maxn];
    
    void init(){
        fac[0] = 1;
    	for(int i = 1 ; i < maxn ; ++ i) fac[i] = mul( fac[i - 1] , i );
    	C[0][0] = 1;
    	for(int i = 1 ; i < maxn ; ++ i){
    		C[i][0] = 1;
    		for(int j = 1 ; j <= i ; ++ j) up( C[i][j] ,  C[i - 1][j - 1] + C[i - 1][j] );
    	}
    }
    
    int A(int n , int m){
    	return mul( fac[n] , qpow( fac[n - m] , mod - 2 ) );
    }
    
    
    int main(int argc,char *argv[]){
    	init();
    	int T=read(),cas=0;
    	while(T--){
    		N=read(),K=read(),P=read();
    		int ans = 0;
    		up( ans , A( N - 1 , K - 1 ) );
    		for(int i = K + 1 ; i < N ; ++ i){
    			for(int j = P + 1 ; j <= N ; ++ j){
    				if( j - 2 < 0 || j - 2 < i - K - 1 ) continue;
    				int y = C[ j - 2 ][ i - K - 1 ];
    				up( ans , mul( y , fac[N - i + K - 1] ) );
    			}
    		}
    		pf("Case #%d: %d
    " , ++ cas , ans );
    	}
    	return 0;
    }
  • 相关阅读:
    Django 请求生命周期
    Django views.py中的 FBV(函数) CBV(类)
    cookie session
    Django admin
    Django ORM QuerySet集合对象的特性
    Django ORM 多对多操作 使用聚合函数和分组 F查询与Q查询
    Django ORM 一对多操作
    Django ORM 单表操作
    Django 模板 template
    css之background-clip: text
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5734081.html
Copyright © 2011-2022 走看看