반응형

문제 출처 :


https://swexpertacademy.com/main/learn/course/subjectDetail.do?subjectId=AWWxxej6Ae4DFAW4#



알고리즘 분석 :


문제 해결에 필요한 사항

1. 정렬 


이 문제는 av + b가 가장 크게 나타나도록 해야한다.


따라서 정렬할 때 a1,b1이 있고 a2,b2가 있다면


a1(a2*v + b2) + b1 과 a2(a1*v + b1) + b2중 무엇이 큰지 비교해야한다.


따라서 내림차순 정렬조건은 a1(a2*v + b2) + b1 > a2(a1*v + b1) + b2가 되고


a1*a2*v +a1*b2 + b1 > a1*a2*v + a2*b1 + b2


a1*b2 - b2 > a2*b1 -b1


b2*(a1 - 1) > b1*(a2 - 1)이 된다.





소스 코드 : 


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
#include <iostream>
#include <algorithm>
 
#define MOD 1000000007
 
using namespace std;
 
typedef long long ll;
 
struct PAIR {
    ll first, second;
};
 
PAIR arr[200002];
 
bool comp(const PAIR &a, const PAIR &b) {
    return b.second * (a.first - 1> a.second * (b.first - 1);
}
int main() {
    int tCase;
    scanf("%d"&tCase);
 
    for (int tc = 1; tc <= tCase; tc++) {
        int n;
        scanf("%d"&n);
 
        for (int i = 0; i < n; i++)
            scanf("%lld %lld"&arr[i].first, &arr[i].second);
 
        sort(arr, arr + n, comp);
 
        ll v = 1;
 
        for (int i = 0; i < n; i++)
            v = ((arr[i].first*v) % MOD + arr[i].second) % MOD;
 
        printf("#%d %lld\n", tc, v);
    }
    return 0;
}
cs

반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[1259번] 금속막대  (0) 2019.05.31
[4번] Median of Two Sorted Arrays  (0) 2019.05.31
[3번] Longest Substring Without Repeating Characters  (0) 2019.05.23
[2번] Add Two Numbers  (0) 2019.05.01
[211번] Add and Search Word  (0) 2019.04.27