728x90
SMALL
문제 이해
평범한 플로이드 와샬 문제다.
map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
정말 평범한 플로이드 와샬 문제를 풀고싶다면: https://www.acmicpc.net/problem/11404
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
여기서 아이템의 개수를 저장할 배열을 추가로 만든다.
그리고 예은이가 갈 수 있는 범위 안에서 아이템의 개수를 전부 더해주고, max함수로 매번 갱신하면 된다.
다시 말해서,
예은이가 도달할 지역 n개를 전부 체크한다.
1번 지역에 도착했다면, 1번 지역의 아이템 개수를 더하고, 1번 지역에서 갈 수 있는 범위에 있는 아이템을 전부 더한다.
2번 지역에서도 동일하게 진행한다
3번 지역에서도
.
.
.
n개 지역에서 체크한 아이템의 합 중 최대값이 문제의 답이 될 것이다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
using ll = long long;
const int INF = 1e8;
const int MAX = 100;
int n, m, r, sum=0, ans=0;
int map[MAX][MAX];
int item[MAX];
void fw() {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
}
}
}
for (int i = 1; i <= n; i++) {
sum += item[i];
for (int j = 1; j <= n; j++) {
if (i != j && map[i][j] <= m) {
sum += item[j];
}
}
ans =max(ans, sum);
sum = 0;
}
cout << ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m >> r;
for (int i = 1; i <= n; i++) {
int t;
cin >> t;
item[i] = t;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
map[i][j] = INF;
if (i == j) map[i][j] = 0;
}
}
for (int i = 1; i <= r; i++) {
int a, b, l;
cin >> a >> b >> l;
map[a][b] = map[b][a] = l;
}
fw();
return 0;
}
https://www.acmicpc.net/problem/14938
14938번: 서강그라운드
예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을
www.acmicpc.net
얏호~ 내 이름 검색해서 나오길래 풀었다.
728x90
LIST
'PS > BOJ' 카테고리의 다른 글
백준 17498 (C++) 폴짝 게임 (2) | 2021.10.06 |
---|---|
백준 17398 (C++) 통신망 분할 (3) | 2021.10.04 |
백준 20044 (C++) Project Teams (0) | 2021.09.30 |
백준 1931 (C++) 회의실 배정 (0) | 2021.09.30 |
백준 11720 (C++) 숫자의 합 (0) | 2021.09.29 |