본문 바로가기
Computer Science

집합과정 프리랜서

by OKOK 2018. 11. 12.

자유직업인 인테리어 업자 두 요청 일정 겹치게 됨. 일정 모두 소화할 수 없음

겹치지 않는 요청들로 일정을 구성해야 함


이런 가능한 일정 중, 가장 돈을 많이 벌 때의 금액을 구하는 프로그램을 작성 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
#define MAXN 500
#define MAXM 10000
#define MAX(a,b) (a)>(b)?(a):(b)
int N, M;
 
typedef struct {
    int s;
    int e;
    int c;
} DATA;
 
DATA data[MAXM + 1];
int d[MAXM + 1];
 
void input();
void DP();
 
void SWAP(DATA *a, DATA *b)
{
    int tmp = a->s;
    a->= b->s;
    b->= tmp;
 
    tmp = a->e;
    a->= b->e;
    b->= tmp;
 
    tmp = a->c;
    a->= b->c;
    b->= tmp;
}
 
void quickSort(int first, int last)
{
    int pivot;
    int i;
    int j;
 
    if (first < last)
    {
        pivot = first;
        i = first;
        j = last;
 
        while (i < j)
        {
            while (data[i].e <= data[pivot].e && i < last)
            {
                i++;
            }
            while (data[j].e > data[pivot].e)
            {
                j--;
            }
            if (i < j)
            {
                SWAP(&data[i], &data[j]);
            }
        }
 
        SWAP(&data[pivot], &data[j]);
 
        quickSort(first, j - 1);
        quickSort(j + 1, last);
    }
}
 
int binarySearch(int low, int high, int target)
{
    int mid;
    if (low > high)
    {
        return 0;
    }
 
    mid = (low + high) / 2;
 
    if (target < data[mid].e)
    {
        binarySearch(low, mid - 1, target);
    }
    else if (data[mid].e < target)
    {
        if (data[mid + 1].e > target)
            return mid;
        else
            binarySearch(mid + 1, high, target);
    }
    else
    {
        return mid;
    }
}
 
int main(void)
{
    int test_case;
    int T;
 
    freopen("test.txt""r", stdin);
    setbuf(stdout, NULL);
    scanf("%d"&T);
 
    for (test_case = 1; test_case <= T; ++test_case)
    {
        input();
        quickSort(1, N);
        DP();
 
        printf("#%d %d\n", test_case, d[N]);
    }
    return 0//정상종료시 반드시 0을 리턴해야 합니다.
}
 
void input()
{
    scanf("%d %d"&N, &M);
    for (int i = 1; i <= N; i++)
    {
        scanf("%d %d %d"&data[i].s, &data[i].e, &data[i].c);
    }
}
 
void DP()
{
    for (int i = 1; i <= N; i++)
    {
        if (i == 1)
            d[i] = data[i].c;
        else
        {
            d[i] = MAX(d[i - 1], d[binarySearch(1, i - 1, data[i].s - 1)] + data[i].c);
        }
    }
}
 
cs


- 왜 정렬을 하고 풀이 하지

- 단순하게 풀면 안되나

- 아 입력이 들어올 때가 다른 것인가

- 그리고 디피로 풀이하는 것은 동일함 


'Computer Science' 카테고리의 다른 글

Week 1 Motivations and Basics Lecture 3 MAP  (0) 2018.11.13
이야기로 설명하는 최대 우도 추정법  (0) 2018.11.13
집합과정 Convex  (0) 2018.11.12
집합과정 무작위 행보  (0) 2018.11.12
3-1 CRT  (0) 2018.11.12

댓글