zoukankan      html  css  js  c++  java
  • HDU 3625 Examining the Rooms

    Problem Description
    A murder happened in the hotel. As the best detective in the town, you should examine all the N rooms of the hotel immediately. However, all the doors of the rooms are locked, and the keys are just locked in the rooms, what a trap! You know that there is exactly one key in each room, and all the possible distributions are of equal possibility. For example, if N = 3, there are 6 possible distributions, the possibility of each is 1/6. For convenience, we number the rooms from 1 to N, and the key for Room 1 is numbered Key 1, the key for Room 2 is Key 2, etc.
    To examine all the rooms, you have to destroy some doors by force. But you don’t want to destroy too many, so you take the following strategy: At first, you have no keys in hand, so you randomly destroy a locked door, get into the room, examine it and fetch the key in it. Then maybe you can open another room with the new key, examine it and get the second key. Repeat this until you can’t open any new rooms. If there are still rooms un-examined, you have to randomly pick another unopened door to destroy by force, then repeat the procedure above, until all the rooms are examined.
    Now you are only allowed to destroy at most K doors by force. What’s more, there lives a Very Important Person in Room 1. You are not allowed to destroy the doors of Room 1, that is, the only way to examine Room 1 is opening it with the corresponding key. You want to know what is the possibility of that you can examine all the rooms finally.
     
    Input
    The first line of the input contains an integer T (T ≤ 200), indicating the number of test cases. Then T cases follow. Each case contains a line with two numbers N and K. (1 < N ≤ 20, 1 ≤ K < N)
     
    Output
    Output one line for each case, indicating the corresponding possibility. Four digits after decimal point are preserved by rounding.
     
    参考:http://blog.csdn.net/queuelovestack/article/details/47970827
    钥匙和门的关系是类似环状的,打开一个门之后,该环内的所有房间都可以进入,怎么说呢,就拿Hint里的#6来举例,Room1 Room2 Room3是在一个环当中的,假设我破坏了Room3,那么我取出Room3内的钥匙Key2就可以打开Room2,而Room2里有钥匙Key1,那我们又可以打开Room1。
    第一类斯特林数可以求解把包含n个元素的集合分成k个环排列的方法数
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <bitset>
    using namespace std;
    typedef long long LL;
    #define MOD 1000000007
    LL fac[25],s[25][25],n,k,T;
    int main(){
      // freopen("test.in","r",stdin);
      cin >> T;
      fac[1] = 1; s[0][0] = 0; s[1][1] = 1; s[1][0] = 0;
      for (int i=2;i<=21;i++){
        fac[i] = fac[i-1] * i;
        s[i][0] = 0;
        for (int j=1;j<=i;j++){
          s[i][j] = s[i-1][j-1] + (i-1) * s[i-1][j];
        }
      }
      for (int i=1;i<=T;i++){
        cin >> n >> k;
        LL ans = 0;
        for (int j=1;j<=k;j++){
          ans += s[n][j] - s[n-1][j-1];
        }
        double anss = ans * 1.0;
        printf("%.4lf
    ",anss/fac[n]);
      }
      return 0;
    }
    View Code
  • 相关阅读:
    《jQuery源码解析》读书笔记(第一章:总体架构)
    无线开发学习笔记
    无线开发知识
    underscore源码了解
    Git 速查手册
    Jetpack Compose之隐藏Scaffold的BottomNavigation
    一种封装Retrofit的方法,可以自动解析Gson,回避Method return type must not include a type variable or wildcard: retrofit2.Call<T>的问题
    整理之Java容器
    整理之Fragment
    整理之BroadcaseReceiver
  • 原文地址:https://www.cnblogs.com/ToTOrz/p/7389630.html
Copyright © 2011-2022 走看看