루오 구 P1056 열 좌석 (아날로그 \ 욕심)

제목 설명

클래스는 항상 학생들과 서로 속삭이는 사람에 대한 몇 가지 앞뒤로, 초등학교 교사가 매우 귀찮은 일이 있습니다 어떤 경우. 그러나 눈 교사는 좌석의 학생들이 완료되면, 제한된 D는 속삭이는 것, 몇 가지 흥미로운 현상을 발견했을 때 클래스의 학생. 학생들은 교실에서 $ M $ 행 $의 N의 $ 열을되었다 앉아, 학생들이 행에 앉아의 위치가 i와 j 열이 $입니다 (난, J) $는에 밖으로 학생을 촉진하기 위해, 교실 $에서 설정 횡 채널 K $으로, 종 방향 채널의 $ 리터의 $. 그래서, 방법, 서로 클래스 속삭이는 학생들의 아마 문제의 스마트 눈 생각 줄일 수있다 : 그녀는이 둘을 분리하는 채널이 $ 2 $를 속삭한다면 있기 때문에, 학생들 사이의 채널의 위치를 ​​변경하기 위해 테이블과 의자, 테이블과 의자를 재 배열 할 계획 학생들은 다음 그들은 속삭임하지 않을 것입니다. 당신이 눈에 프로그램을 작성시겠습니까, 우리는 최고의 채널 분할 방식을 제공합니다. 이 계획에서, 클래스 속삭이는 학생들의 최소 수.

입력 및 출력 형식

입력 형식

A의 첫번째 행, \ (5 \) 의 공간 분리 된 정수이다 (M, N, K \ L, D (2 \ 르 N, M \ 르 1000,0 \ 르 K <M, 0 \ 르 L <N, D \ 르 2000) \) 다음 \ (D \) 행을 갖는 각 행 \ (4 \) 의 공간 분리 된 정수. \ (I는 \)\ (4 \) 정수 \ (x_i로부터는 Y_i는 P_i는 Q_i는 \) , 좌석 위치 나타내는 \ ((x_i로부터, Y_i) \ ) 와 \ ((P_i, Q_i)를 \ ) (그들은 인접한 또는 수평으로 인접한 보장하기 위해 입력 전후) 두 학생은 속삭 일 것입니다. 입력 데이터는 최적의 솔루션의 고유성을 보장한다.


출력 형식

두 줄의 총. 첫 번째 라인은 $ 정수 $ A_1, A_2, ... a_K $, $ 첫번째 라인 $ A_2 $ $ A_2 + 1 $ 선 사이에, 제 1 및 A_1 $ $으로의 A_1 + 1 $ 선 사이의 선을 나타내는 $ K 포함 ... a_k 첫번째 행 달러와 $ $ a_K + $ 1 $ A_I <A_I + 1 $은 각각 두 개의 정수 (광고 공간없이 단부) 사이의 공간에 의해 분리 된 행 사이의 통로를 연다. 두 번째 행은 L $ $ 정수 $ B_1는 B_2, ... b_L $, $는 첫번째 칼럼 B_1 $ $ B_1 + 1 $ 행, 첫 번째 열 및 $ B_2 $ $ B_2 + 1 $ 열 사이 나타낸다 포함 ... $ b_L $의 $ b_L + 열 및 채널을 열어 $ (1) 사이의 열, 여기서 두 개의 정수 (EOT 공백) 사이의 공간으로 구분 $ b_i <b_i + 1 $ 각.

샘플 입출력

입력 샘플 # 1

4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4

출력 예제 # 1

2
2 4

설명

심볼함으로써 상기 그림, ※, + 표시 * (3 \) \ 학생의 위치도 속삭이는한다 \ (3 \) 굵은 선이 채널의 위치를 나타내고, 채널 분할 방식 만 도시되어 최적의 솔루션입니다.
2008 년 그룹 II 타이틀의 인기

생각

당신은 소형에서 대형으로 출력에주의를 지불해야합니다, 시뮬레이션을 지시 할 수있다.

코드

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000 + 10;
int M, N, K, L, D;
set<int> ansl, ansc;
struct node
{
    int id;
    int val;
    bool operator<(const node &rhs)
    {
        return val > rhs.val;
    }
} lin[MAXN], cal[MAXN];

bool cmp(const node& a, const node& b)
{
    return a.id < b.id;
}

void init(int m, int n)
{
    for (int i = 1; i <= m; i++)
    {
        lin[i].id = i;
        lin[i].val = 0;
    }
    for (int i = 1; i <= n; i++)
    {
        cal[i].id = i;
        cal[i].val = 0;
    }
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    cin >> M >> N >> K >> L >> D;
    init(M, N);
    for (int i = 0; i < D; i++)
    {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        if (x1 == x2)
            cal[min(y1, y2)].val++;
        else
            lin[min(x1, x2)].val++;
    }
    sort(lin + 1, lin + 1 + M);
    sort(cal + 1, cal + 1 + N);
    sort(lin + 1, lin + 1 + K, cmp);
    sort(cal + 1, cal + 1 + L, cmp);
    for (int i = 1; i <= K; i++)
    {
        if (i != 1)
            cout << " ";
        cout << lin[i].id;
        if(i == K)cout << endl;
    }
    for (int i = 1; i <= L; i++)
    {
        if (i != 1)
            cout << " ";
        cout << cal[i].id;
        if(i == L)cout << endl;
    }
}

추천

출처www.cnblogs.com/YY666/p/11360209.html