반응형
문제 출처 :
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 |