题解 | #Mate in 33#F IUPC

IUPC

https://ac.nowcoder.com/acm/contest/57364/F

题意: n个数 有t时间 每个时间可以选择一个合法的数(每个数只能选择一次),连续k个时间最多选m个,问有多少种方法数

思路:想到区间k状态必须要2^k表示对于t 300 ,剩余只有10+的空间给n,思考每次可以选择前缀所有,故每次可以可能可以选多个 看前一状态,若前一个状态选到j个那这个可以选到num[i]-j个

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
int n,t,m,k,dp[305][15][1<<11],num[305],a[15];
signed main()
{
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    cin>>n>>t>>k>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        num[a[i]]++;
    }
    for(int i=1;i<=t;i++){
        num[i]=num[i]+num[i-1];
    }
    dp[0][0][0]=1;
    for(int i=1;i<=t;i++){
        for(int j=0;j<=num[i-1];j++){//此处已经做了多少题
            for(int s=0;s<(1LL<<k);s++){
                dp[i][j][s>>1]=(dp[i][j][s>>1]+dp[i-1][j][s])%mod;
                int nx = (s>>1)|(1<<(k-1));
                int res = __builtin_popcount(nx);
                //1.新状态1个数x<=m,x<=num[i]
                //2.j<num[i]
                if(res<=m&&res<=num[i]&&j<num[i]){
                    dp[i][j+1][nx]=(dp[i][j+1][nx]+dp[i-1][j][s]*(num[i]-j)%mod)%mod;
                }
            }
        }
    }
    int ans = 0;
    for(int i=0;i<(1LL<<k);i++){
        ans=(ans+dp[t][n][i])%mod;
    }
    cout<<ans<<'\n';
    return 0;
}


全部评论

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
在努力的外卷侠很靠谱:怎么,大家都没保底吗?我这美团已经入职了,不说了,系统派单了。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务