Рабочий стол > DL Руководство пользователя > ... > Полезные факты о С++ и примеры задач > next_permutation > Просмотр
next_permutation Войти | Зарегистрироваться   Просмотр версии для печати текущей страницы.

Добавлено Egor, последний раз изменено Egor Oct 23, 2016
Метки: 
(нет)

next_permutation(a, a+n)- при вызове в цикле выдаёт последовательно все перестановки массива a

--------------------------------------------

07_MarB. Cows Of The Round Table
http://dl.gsu.by/task.jsp?nid=143195&cid=15

Идея решения - генерируем все перестановки и проверяем каждую
на выполнение требования. Если требование выполнено - инкрементируем
ответ.

Чтобы исключить многократный учёт одинаковых перестановок сдвинутых
по кругу, фиксируем начальный элемент (0). И next_permutation вызываем
для элементов с 1 по n-1 включительно.

next_permutation переставляет указанные элементы в новую перестановку
в лексикографическом порядке, если перестановка не повторялась,
возвращает true, если получилась начальная перестановка - возвращает
false

Полный текст решения

all.cpp
#include <bits/stdc++.h>
using namespace std;

int n,k,m[12],a[12];

bool Good()
  {
    int i;
    for (i=0; i<n && abs(m[a[i+1]]-m[a[i]])<=k ; i++);
    return i==n;
  }

int main()
{
    ifstream cin("round.in");
    ofstream cout("round.out");

    cin >> n >> k;
    for (int i=0; i<n; i++)
      {
        cin >> m[i];
        a[i]=i;
      }
    a[n]=0;
    int ans=0;
    do if (Good()) ans++;
      while(next_permutation(a+1, a+n));
    cout << ans;
}
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: http://www.atlassian.com/software/confluence Build:#2.6.1 916) - Ошибка/новая особенность - Свяжитесь с Администраторами