首页 > 解决方案 > 分配任务的方式数

问题描述

问题陈述:你有 n 个人围成一圈坐着。每个人都有一个技能值 arr[i]。您希望将人员分配给这些任务。为特定任务选择的人员必须全部连续坐着,并且他们的技能差距(最大到最小)的差异不得超过 K。此外,每个人都必须被分配一个任务。以 1e9+7 为模,将任务分配给所有人的方法有多少 如果我和 j 以不同的方式执行相同的任务,则认为两种方式不同。

示例输入:n=2

k=2

arr[]= {1,2}

样本输出:2

解释:有 2 种方法,1 和 2 做相同的任务或不做。两者都是有效的陈述。

我被困在这个问题上。早些时候我试图这样解决它:

    //assuming necessary header files

int solve(int arr[], int n, int k){
    map<int,vector<int>> mp;
    for(int i=1;i<n;++i){
        int temp= abs(arr[i]-arr[i-1]);
        if(temp<=k)[
            mp[temp].push_back(arr[i]);
            mp[temp].push_back(arr[i-1]);
        ]
    }
    int ans=0;
    for(auto it: mp){
        vector<int> p= it.second;
        int szz= p.size();
        ans+= 2*(szz*(szz-1))/2;
    }
    return ans;
}
int main() {
    int n,k;
    cin>>n>>k
    int arr[n];
    for(int i=0;i<n;++i){
        cin>>arr[i];
    }
    cout<<solve(arr,n,k)<<endl;
    return 0;
}

我的方法是将所有技能差距小于 k 的连续人员存储在一个键值对中,然后返回每个键值对大小的两倍。我得到了错误的答案判决。要么我无法清楚地理解这个问题,要么我以错误的方式实施了它。任何人都可以更正它并让我知道正确的解决方案吗?谢谢

标签: c++algorithmdata-structurescombinatorics

解决方案


推荐阅读