본문 바로가기
Computer Science

롤러코스터

by OKOK 2019. 2. 25.

1. 롤러코스터

2. 머지

3. 관리

4. 인덱스 관리

5. 인덱스 따라 가도록 관리하기

6. 그리고 main, user 어떻게 흘러가는지 파악하기 


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
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
const int MAXN = 200000;
 
int CalcFinalSpeed(int N, int *a, int *b, int *p) {
    int v = 1;
 
    for (int i = 0; i < N; i++) {
 
        int CurRail = p[i];
 
        v = (int)(((long long)(a[CurRail])*+ b[CurRail]) % 1000000007);
    }
 
    return v;
}
extern int MinRailSpeed(int N, int *a, int *b);
 
int a[MAXN], b[MAXN];
 
int main(void) {
    setbuf(stdout, NULL);
 
    freopen("input.txt""r", stdin);
    int TestCase; for (scanf("%d"&TestCase); TestCase--;) {
 
        int N; scanf("%d"&N);
 
        for (int i = 0; i < N; i++) {
            scanf("%d%d"&a[i], &b[i]);
        }
 
        int answer = MinRailSpeed(N, a, b);
 
        static int tc = 0;
        printf("#%d %d\n"++tc, answer);
    }
    return 0;
}
cs

 


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
extern int CalcFinalSpeed(int N, int *a, int *b, int *p);
 
#define MAXN 200000
 
double arr[MAXN];
double sorted[MAXN];
int idx[MAXN];
int sortedIdx[MAXN];
 
 
void merge(int left, int mid, int right)
{
    int i, j, k, l;
 
    i = left;
    j = mid + 1;
    k = left;
 
    while (i<=mid && j<=right)
    {
        if (arr[i] >= arr[j])
        {
            sortedIdx[k] = idx[i];
            sorted[k++= arr[i++];
        }
        else
        {
            sortedIdx[k] = idx[j];
            sorted[k++= arr[j++];
        }
    }
 
    if (i > mid)
    {
        while (j <= right)
        {
            sortedIdx[k] = idx[j];
            sorted[k++= arr[j++];
        }
    }
    else
    {
        while (i <= mid)
        {
            sortedIdx[k] = idx[i];
            sorted[k++= arr[i++];
        }
    }
    
    for (l = left; l <= right; l++)
    {
        idx[l] = sortedIdx[l];
        arr[l] = sorted[l];
    }
}
 
void merge_sort(int left, int right)
{
    int mid;
    if (left < right)
    {
        mid = (left + right) / 2;
        merge_sort(left, mid);
        merge_sort(mid + 1, right);
        merge(left, mid, right);
    }
    return;
}
 
int MinRailSpeed(int N, int *a, int *b) {
    int answer = 1;
 
    //(ai-1)/bi 로 정렬을 하고,
    // 
    for (int i = 0; i < N; i++)
    {
        arr[i] = (double)(a[i] - 1/ b[i];
        idx[i] = i;
    }
    
    merge_sort(0, N - 1);
 
    answer = CalcFinalSpeed(N, a, b, idx);
    return answer;
}
cs

 


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

줄 세우기 아메리칸 조식  (0) 2019.03.05
compare 함수 사용  (0) 2019.02.25
가능한 시험 점수  (0) 2019.02.19
문제 풀이  (0) 2019.02.19
동한이의 정수 나열  (0) 2019.02.19

댓글