Skip to main content

Field Trip-FTRIP

Problem Link

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int N = 1001;
double ncr[N][N];

void calNCR()
{
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
            ncr[i][j] = 0;
    }

    for(int i = 0; i < N; i++)
    {
        ncr[i][0] = ncr[i][i] = 1.0;
        for(int j = 1; j < i; j++)
        {

            ncr[i][j] = ncr[i - 1][j - 1] + ncr[i - 1][j];
        }
    }
}

int main()
{
    int t, s, n, m, k;

    calNCR();
    cin >> t;
    for(int j = 0; j < t; j++)
    {
        cin >> s >> n >> m >> k;

        double den = ncr[s - 1][n - 1];
        double num = 0;

        /* if s = 6, m = 4, n = 4, k = 1. Here 2 people from m will go to the trip for sure.
           One of them is Alice, so one more friend will picked up for sure. So we should start checking              probability of picking from 2(mc2) because 1 will be picked up for sure
            so start i from max(k, n - 1 + m - s)  instead of k
        */

        for(int i = max(k, n - 1 + m - s); i <= min(m - 1, n - 1); i++)
        {
            num += (ncr[m - 1][i] * ncr[s - m][n - i - 1]);
        }
        printf("%.9lf\n", num/den);
    }
    return 0;
}

Comments

Popular posts from this blog

MAIN72

MAIN72 - Subset sum #include <iostream> #include <cstring> using namespace std; bool dp[100001][1001]; int arr[1001]; int main() {     int t, n;     long long int sum;     cin >> t;     while(t--)     {         cin >> n;         memset(dp, false, sizeof(dp));         sum = 0;         for(int i = 0; i < n; i++)         {             cin >> arr[i];             sum += arr[i];         }         for(int i = 0; i < n; i++)             dp[0][i] = true; // 0 sum         for(int i = 1; i < n; i++)             dp[i][0] = false; // sum is i but 0 element         for(long int i = 1; i <= sum; i++)         {             for(int j = 1; j <= n; j ++)             {                 dp[i][j] = dp[i][j - 1];                 if(i >= arr[j - 1])                     dp[i][j] = dp[i][j] || dp[i - arr[j - 1]][j - 1];             }         }         long int result = 0;         for(int i = 1; i <= sum; i++)  

War of XORs- XORIER

Problem Link #include <iostream> using namespace std; int main() { int t, n, odd, even; cin >> t; while(t--) { cin >> n; int i,arr[n],freq[1100001]={0}; long res = 0; odd = even = 0; for(int i = 0; i < n; i++) { cin >> arr[i]; freq[arr[i]]++; } for(int i = 0; i < n; i++) { if(arr[i] & 1) { odd++; } else { even++; } } for(int i = 0; i < n; i++) { if(arr[i] % 2) { res += odd; } else { res += even; } res -= freq[arr[i] ^ 2]; res -= freq[arr[i]]; } cout << res / 2 << endl; } }

GCJ101BB - Picking Up Chicks

Problem Link /* explanation     lets solve the problem only for 2 chicken.     s[i] = speed of chicken i     pos[i] = position of chicken i     if s[i] > s[i - 1] then no problem, just check whether both can reach b within time or not.     if s[i] < s[i - 1] then there is a chance that i can slow down i - 1.     lets say s[i] = 1 m/sec and s[i - 1] = 2 m/sec and time limit is T and point to reach is B.     for s[i] pos[i] can be at max B - T. if pos is greater than B-T it can not reach within Tsec.     and for s[i - 1] pos[i - 1] can be at max (B-T)*2. if pos[i - 1] > (B-T)*2 it can not reach within Tsec.     at T sec i will be at B and i - 1 will also be at B. at T - 1 i will be at B-T-1 and i-1 will be at B-T-2 and so on. as we can see i -1 will always be behind i. so there will not be any collision.     if i is pos[i] < B-T then i can reach B before T sec and it will not cause any problem .     problem may occur if pos[i - 1]< (B -T)*2 as it can me