zoukankan      html  css  js  c++  java
  • 8VC Venture Cup 2016

    F. Group Projects

    题目连接:

    http://www.codeforces.com/contest/626/problem/F

    Description

    There are n students in a class working on group projects. The students will divide into groups (some students may be in groups alone), work on their independent pieces, and then discuss the results together. It takes the i-th student ai minutes to finish his/her independent piece.

    If students work at different paces, it can be frustrating for the faster students and stressful for the slower ones. In particular, the imbalance of a group is defined as the maximum ai in the group minus the minimum ai in the group. Note that a group containing a single student has an imbalance of 0. How many ways are there for the students to divide into groups so that the total imbalance of all groups is at most k?

    Two divisions are considered distinct if there exists a pair of students who work in the same group in one division but different groups in the other.

    Input

    The first line contains two space-separated integers n and k (1 ≤ n ≤ 200, 0 ≤ k ≤ 1000) — the number of students and the maximum total imbalance allowed, respectively.

    The second line contains n space-separated integers ai (1 ≤ ai ≤ 500) — the time it takes the i-th student to complete his/her independent piece of work.

    Output

    Print a single integer, the number of ways the students can form groups. As the answer may be large, print its value modulo 109 + 7.

    Sample Input

    3 2
    2 4 5

    Sample Output

    3

    Hint

    题意

    有n个人,每个人有能力值ai,你需要去将这n个人分组

    每一组的分值是这一个组的最大值减去最小值,你需要使得所有组的分值和小于等于k

    问你方案数一共有多少种

    题解:

    dp

    我们先排序,这样好DP

    dp[i][j][k]表示考虑了i个人,现在open的组有j个(只有最小值,没有最大值的组),分值和为k的方案数

    我们考虑第i个人加进去的时候,他对分值的贡献,应该是j*(a[i]-a[i-1]),不管这个数加到哪个组里面,贡献都是这个。

    为什么?因为open的都在等待最大值的到来咯,考虑差分。

    然后转移的时候,可以新开一个open,可以转移到open里面去,可以关闭一个open

    空间开不下,滚一下就好了。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int mod = 1e9+7;
    int dp[2][205][1005];
    int a[1005];
    int n,k;
    void update(int &x,int y)
    {
        x=(x+y)%mod;
    }
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        dp[0][0][0]=1;
        for(int i=1;i<=n;i++)
        {
            memset(dp[1],0,sizeof(dp[1]));
            for(int j=0;j<=n;j++)
            {
                for(int p=0;p<=k;p++)
                {
                    if(p+j*(a[i]-a[i-1])<=k)
                    {
                        update(dp[1][j][p+j*(a[i]-a[i-1])],dp[0][j][p]);
                        if(j>=1)
                        {
                            update(dp[1][j-1][p+j*(a[i]-a[i-1])],1LL*dp[0][j][p]*j%mod);
                            update(dp[1][j][p+j*(a[i]-a[i-1])],1LL*dp[0][j][p]*j%mod);
                        }
                        update(dp[1][j+1][p+j*(a[i]-a[i-1])],dp[0][j][p]);
                    }
                }
            }
            memcpy(dp[0],dp[1],sizeof(dp[0]));
        }
        int ans = 0;
        for(int i=0;i<=k;i++)
            update(ans,dp[0][0][i]);
        cout<<ans<<endl;
    }
  • 相关阅读:
    ACM FPGA 2019 -- Reconfigurable Convolutional Kernels for Neural Networks on FPGAs 论文解读
    VLSI基础-- 第六章 时序逻辑电路
    ISSCC-2020:GANPU 论文解读
    fabric知识梳理图解
    在浏览器端获取文件的MD5值
    mysql实现随机获取几条数据的方法
    数据仓库之Data Vault模型总结
    大数据分析基础——维度模型
    ArrayList类源码解析——ArrayList动态数组的实现细节(基于JDK8)
    Java的四个标记接口:Serializable、Cloneable、RandomAccess和Remote接口
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5188956.html
Copyright © 2011-2022 走看看