티스토리 뷰
https://www.acmicpc.net/problem/13164
13164번: 행복 유치원
입력의 첫 줄에는 유치원에 있는 원생의 수를 나타내는 자연수 N(1 ≤ N ≤ 300,000)과 나누려고 하는 조의 개수를 나타내는 자연수 K(1 ≤ K ≤ N)가 공백으로 구분되어 주어진다. 다음 줄에는 원생들
www.acmicpc.net
하나의 그룹의 티셔츠 비용은 가장 큰 원생 - 가장 작은 원생이다.
그런데 만약 인접한 원생의 차를 모두 구해놓고 보면, 티셔츠 비용은 인접한 원생의 차들의 합이기도 하다.
예를들어 입력값이
1 3 5 6 10 이라면 인접한 원생의 차는
2 2 1 4 이다.
만약 (3,5,6)이 한 그룹이라면 티셔츠 비용은 6-3=3 이기도 하지만,
인접한 원생의 차들의 합인 2+1=3 이기도 하다.
그룹에 한명만 속해있다면 티셔츠 비용은 0이므로,
최솟값을 구하려면 인접한 원생의 차가 최대인 부분을 그룹의 경계로 설정해주면된다.
즉 인접한 원생의 차 : 2 2 1 4를 정렬해서 4 2 2 1
가장 큰 k-1개의 값을 제외한 합이 답이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, k;
vector<int> v;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n >> k;
v.resize(n);
for(int i = 0; i < n; i++)
cin >> v[i];
// 인접한 원생 둘의 키의 차
vector<int> sub;
for(int i = 0; i < n-1; i++)
{
int subtraction = v[i+1]-v[i];
sub.push_back(subtraction);
}
// 내림차순 정렬
sort(sub.begin(), sub.end(), greater<>());
// 가장 큰 k-1 (경계가되는)을 제외한 나머지의 합
int ans = 0;
for(int i = k-1; i < n-1; i++)
ans += sub[i];
cout << ans;
}
'PS' 카테고리의 다른 글
백준 20044. Project Teams (0) | 2021.08.30 |
---|---|
백준 1417. 국회의원 선거 (0) | 2021.08.30 |
백준 2872. 우리집엔 도서관이 있어 (0) | 2021.08.28 |
백준 2262. 토너먼트 만들기 (0) | 2021.08.27 |
백준 14241. 슬라임 합치기 (0) | 2021.08.26 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자료구조
- permutation
- Implementation
- priority queue
- back tracking
- recursion
- dfs
- binary search
- Dijkstra
- two pointer
- Tree
- Unity
- 조합
- Stack
- CSS
- Brute Force
- graph
- Kruskal
- 이분탐색
- Spring
- Python
- greedy
- floyd warshall
- BFS
- db
- DP
- MVC
- C
- 재귀
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함