Количество способов назначения задач - PullRequest
0 голосов
/ 30 марта 2020

Постановка задачи: В кругу сидят n человек. Каждый человек имеет значение навыка arr [i]. Вы хотите назначить людей на эти задачи. Люди, выбранные для конкретной задачи c, должны все сидеть последовательно, и их разрыв в навыках (от максимума до минимума) не должен отличаться более чем на K. Кроме того, каждому человеку должно быть назначено ровно одно задание. Сколько существует способов назначить задачи всем людям по модулю 1e9 + 7 Два способа считаются разными, если люди I и 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, для сохранения в паре ключ-значение, а затем возвращать дважды каждое значение ключа размер пары. Я получил неправильный ответ вердикт. Либо я не могу четко понять вопрос, либо я неправильно его реализовал. Может кто-нибудь, пожалуйста, исправьте это и дайте мне знать правильное решение для того же самого? Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...