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;
    }
  • 相关阅读:
    ROS学习笔记8-rqt_console和roslaunch
    ROS学习笔记11-写一个简单的服务和客户端(C++版本)
    ROS学习笔记10-写一个简单的订阅者和发布者(C++版本)
    ROS学习笔记9-创建ros消息和服务
    ROS学习笔记INF-重要操作列表
    ROS学习笔记1-引言
    ROS学习笔记6-理解主题
    ROS学习笔记5-理解节点(Node)
    ROS学习笔记4-创建一个ROS包
    算是入行 ISP 了吧
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5188956.html
Copyright © 2011-2022 走看看