https://www.acmicpc.net/problem/13335
다리의 상태와 트럭의 상태를 나타내야 한다.
다리의 경우, 지금 버티고 있는 무게가 몇인지 그리고 현재 다리 위에 몇 개의 트럭이 올라와 있는지를 항상 유지해야 한다.
트럭의 경우에는, 각 트럭 별로 트럭의 무게, 그리고 다리 위에 있는지 여부, 그리고 다리 위에 존재한 시간(혹은 거리)을 유지해야 한다.
따라서 위와 같은 조건을 나타내기 위해서 구조체를 사용했다.
무한 루프를 만들고, 마지막 차가 다리를 탈출하는 순간을 루프 탈출 조건으로 잡았다.
#include<iostream> using namespace std; struct Bridge { int wei = 0; //다리에 가해진 무게 int cnt = 0; //다리위 차의 개수 }; struct Car { int wei = 0; //차의 무게 int time = 0;//차의 이동 시간(거리) bool onBri = false; //차가 다리위에 있는지 여부 }; Car car[2000]; Bridge brg; int n, len, lim; //차의 개수, 다리의 길이, 하중 제한 int main(void) { cin >> n >> len >> lim; for (int i = 0; i < n; i++) cin >> car[i].wei; brg.cnt = 0; brg.wei = 0; int idx = 0, Time = 0; //다리위에 올라가는 차의 인덱스, 전체 시간 bool endFlag = false; while (1) { //다리 위의 차들 이동(시간 증가) for (int i = 0; i < n; i++) { if (car[i].onBri) { car[i].time++; //printf("%d번 차 움직인 거리: %d\n", i, car[i].time); if (car[i].time >= len) { if (i == n - 1) { //다리를 벗어나는 차가 마지막 차라면 endFlag = true; Time++; break; } //이 차가 다리를 다 건너면 brg.cnt--; brg.wei = brg.wei - car[i].wei; car[i].onBri = false; } } } if (endFlag) break; if (lim - brg.wei >= car[idx].wei && brg.cnt < len) { //가능한 무게이면서 다리위에 공간이 남았으면 car[idx].onBri = true; brg.wei = brg.wei + car[idx].wei; idx++; brg.cnt++; } Time++; } cout << Time << '\n'; return 0; }
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 17281번: 야구 ⚾ (C++) (0) | 2019.07.26 |
---|---|
백준 17144번: 미세먼지 안녕 (C++) (0) | 2019.07.25 |
백준 5014번: 스타트링크 (C++) (0) | 2019.07.24 |
백준 14499번: 주사위 굴리기 (C++) (0) | 2019.07.24 |
백준 1547번: 공 (C++) (0) | 2019.07.24 |