해당 과제를 처리할 수 있는 날 중 최대한 늦은 날을 찾아 이 과제를 하는 날로 정합니다.
예를 들어 과제가 4일 까지라면
4일, 3일, 2일, 1일을 보면서 이미 해당 날짜가 차지되어 있는지 확인하고
모두 이미 차지되었다면 이 과제를 할 수 없는 것입니다.
문제 풀이는 우선순위 큐를 이용해도 되고
벡터 정렬을 이용해도 됩니다.
2.문제풀이코드 C++
1.벡터정렬
#include <bits/stdc++.h>
using namespace std;
int n;
bool ch[1001];
struct Hw {
int day, point;
bool operator<(const Hw& b) const {
return point > b.point;
}
};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
vector<Hw> v;
cin >> n;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
v.push_back({ a,b });
}
sort(v.begin(), v.end());
int ans = 0;
for (int i = 0; i <v.size(); i++) {
int day = v[i].day;
int point = v[i].point;
while (ch[day] && day>=1) {
day--;
}
if (day == 0) continue;
ch[day] = 1;
ans += point;
}
cout << ans << '\n';
return 0;
}
2. 우선순위 큐 활용
#include <bits/stdc++.h>
using namespace std;
int n;
bool ch[1001];
struct Hw {
int day, point;
bool operator<(const Hw& b) const {
return point < b.point;
}
};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
priority_queue<Hw> Q;
cin >> n;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
Q.push({ a,b });
}
int ans = 0;
while (!Q.empty()) {
int day = Q.top().day;
int point = Q.top().point;
Q.pop();
while (ch[day] && day>=1) {
day--;
}
if (day == 0) continue;
ch[day] = 1;
ans += point;
}
cout << ans << '\n';
return 0;
}
한 간선을 한 번씩 방문할 수 있을 때 2번으로 갈 수 있는 경우가 몇 개 인지 구해야한다.
한 간선을 한 번씩 방문할 수 있다는 말은
한 간선에 1명만 이동할 수 있다는 말과 같고
이 때 2번으로 총 몇명이 도착 할 수 있는지 최대유량을 구해야 하는 문제다.
3.문제풀이코드 C++
#include <bits/stdc++.h>
using namespace std;
const int MAX = 401;
int n, p,res;
int c[MAX][MAX], f[MAX][MAX], d[MAX];
vector<int> adj[MAX];
void maxFlow(int start, int end) {
while (1) {
fill(d, d + MAX, -1);
queue<int> Q;
d[start] = 0;
Q.push(start);
while (!Q.empty() && d[end] == -1) {
int x = Q.front();
Q.pop();
for (int i = 0; i < adj[x].size(); i++) {
int nx = adj[x][i];
if (d[nx] == -1 && c[x][nx] - f[x][nx] > 0) {
Q.push(nx);
d[nx] = x;
if (nx == end) break;
}
}
}
if (d[end] == -1) break;
int flow = INT_MAX;
for (int i = end; i != start; i = d[i]) {
flow = min(flow, c[d[i]][i] - f[d[i]][i]);
}
for (int i = end; i != start; i = d[i]) {
f[d[i]][i] += flow;
f[i][d[i]] -= flow;
}
res += flow;
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> p;
for (int i = 0; i < p; i++) {
int a, b;
cin >> a >> b;
c[a][b] = 1;
adj[a].push_back(b);
adj[b].push_back(a);
}
maxFlow(1, 2);
cout << res << '\n';
return 0;
}