BOJ 2056
λ¬Έμ
μμ μ±κ³΅
2 μ΄ 256 MB 11054 5110 3656 43.215% λ¬Έμ
μνν΄μΌ ν μμ Nκ° (3 ≤ N ≤ 10000)κ° μλ€. κ°κ°μ μμ λ§λ€ 걸리λ μκ°(1 ≤ μκ° ≤ 100)μ΄ μ μλ‘ μ£Όμ΄μ§λ€.
λͺλͺ μμ λ€ μ¬μ΄μλ μ ν κ΄κ³λΌλ κ² μμ΄μ, μ΄λ€ μμ μ μννκΈ° μν΄ λ°λμ λ¨Όμ μλ£λμ΄μΌ ν μμ λ€μ΄ μλ€. μ΄ μμ λ€μ λ²νΈκ° μμ£Ό μμκ² λ§€κ²¨μ Έ μμ΄μ, Kλ² μμ μ λν΄ μ ν κ΄κ³μ μλ(μ¦, Kλ² μμ μ μμνκΈ° μ μ λ°λμ λ¨Όμ μλ£λμ΄μΌ νλ) μμ λ€μ λ²νΈλ λͺ¨λ 1 μ΄μ (K-1) μ΄νμ΄λ€. μμ λ€ μ€μλ, κ·Έκ²μ λν΄ μ ν κ΄κ³μ μλ μμ μ΄ νλλ μλ μμ μ΄ λ°λμ νλ μ΄μ μ‘΄μ¬νλ€. (1λ² μμ μ΄ νμ κ·Έλ¬νλ€)
λͺ¨λ μμ μ μλ£νκΈ° μν΄ νμν μ΅μ μκ°μ ꡬνμ¬λΌ. λ¬Όλ‘ , μλ‘ μ ν κ΄κ³κ° μλ μμ λ€μ λμμ μν κ°λ₯νλ€.
μ λ ₯
첫째 μ€μ Nμ΄ μ£Όμ΄μ§λ€.
λ λ²μ§Έ μ€λΆν° N+1λ²μ§Έ μ€κΉμ§ Nκ°μ μ€μ΄ μ£Όμ΄μ§λ€. 2λ²μ§Έ μ€μ 1λ² μμ , 3λ²μ§Έ μ€μ 2λ² μμ , ..., N+1λ²μ§Έ μ€μ Nλ² μμ μ κ°κ° λνλΈλ€. κ° μ€μ μ²μμλ, ν΄λΉ μμ μ 걸리λ μκ°μ΄ λ¨Όμ μ£Όμ΄μ§κ³ , κ·Έ λ€μμ κ·Έ μμ μ λν΄ μ ν κ΄κ³μ μλ μμ λ€μ κ°μ(0 ≤ κ°μ ≤ 100)κ° μ£Όμ΄μ§λ€. κ·Έλ¦¬κ³ μ ν κ΄κ³μ μλ μμ λ€μ λ²νΈκ° μ£Όμ΄μ§λ€.
μΆλ ₯
첫째 μ€μ λͺ¨λ μμ μ μλ£νκΈ° μν μ΅μ μκ°μ μΆλ ₯νλ€.
μμ μ λ ₯ 1 볡μ¬
7 5 0 1 1 1 3 1 2 6 1 1 1 2 2 4 8 2 2 4 4 3 3 5 6
μμ μΆλ ₯ 1 볡μ¬
23β
νμ΄
μ ν΄μ§ μμμ λ°λΌ μμ μ μνν΄ κ·Έλνμ λ§μ§λ§ λ Έλμ ν΄λΉνλ μμ μ λλ΄μΌ νλ μμμ λ ¬ λ¬Έμ μ΄λ€.
μ¬μ΄ν΄μ΄ μκΈ°λ©΄ μμμ λ ¬μ΄ μ±λ¦½λ μ μμ§λ§, μ΄ λ¬Έμ λ μ¬μ΄ν΄μ΄ μμκΈ΄λ€λ κ°μ νμ νλ©΄ λλ€.(μ§λ¬Έμ κ΄λ ¨λ΄μ©μ΄ μκΈ° λλ¬Έ)
μ°μ μκ°, μμ μν μ μλ£λμΌν μμ μ μ, μμ μν μ μλ£λμΌν μμ λ²νΈκ° μ£Όμ΄μ§λ€.
κ·Έλ¬λ―λ‘ μ΄λ₯Ό ꡬ쑰체λ₯Ό ν΅ν΄ μ μΈν΄μ£Όμλ€.
struct p{
int time;
vector<int>edges;
int num;
};
κ·Έλ°λ° μ¬κΈ°μ edges 벑ν°μ λ€μ΄κ°μΌ νλ κ°λ€μ μν μ μλ£λμΌν μμ λ²νΈκ° μλλΌ μ΄ μμ μν ν μνλ μμ μ λ²νΈκ° λ€μ΄κ°μΌ νλ€.
μμμ λ ¬μμλ μΌμ μμμ λ°λΌ κ°μ μ λ°©ν₯μ΄ μ‘νμΌ νλ―λ‘ κ·Έλ λ€.
λν, νΉμ μμ μ λν ꡬ쑰체λ₯Ό μΈλ±μ€λ₯Ό ν΅ν΄ λ°λ‘ μ κ·Όν μ μκ² νκΈ° μν΄ κ΅¬μ‘°μ²΄ pν 벑ν°λ₯Ό νλ μ μΈν΄μ£Όμλ€.
vector<p>v(10001);
μ λ ₯λ°μλ κ°μ μ 보 μ λ ₯λ°λ λΆλΆμ μ£Όμνμ. μ λ ₯λ°μ μμ μ νμ¬ μμ μ λ£μ΄μ£Όμ΄μΌ νλ€.
for(int i=1; i<=N; i++){
int time, s_num;
cin>>time>>s_num;
if(s_num == 0) q.push(i);
v[i].time = time;
v[i].num = s_num;
for(int j=0; j<s_num; j++){
int s;
cin>>s;
v[s].edges.push_back(i);
}
}
κ·Έ λ€μμ μμμ λ ¬μ νλ μ½λμΈλ°, μ΄ λ¬Έμ μμλ νΉμ μμ μ΄ μνλκΈ° μ΄μ μ μκ°μ΄ μΌλ§λ κ±Έλ Έλλ₯Ό λ°λ‘ κΈ°λ‘ν΄μΌ νλ€.
queueμμ 맨 μμΌλ‘ κ°λ κ²½μ°κ° νΉμ μμ μ΄ μνλλ κ²½μ°μ΄λ―λ‘ arr[q.front()] μ κ·Έ μμ μ΄ μΌλ§λ κ±Έλ Έλλ₯Ό λ°λ‘ λν΄μ£Όκ³ ,
q.front()μ ν΄λΉνλ μμ μ΄ λλ ν μνλλ μμ μ κ°μ q.front() μμ μ΄ λλ μκ°μ λΉκ΅ν΄μ λ£μ΄μ£Όμ΄μΌ νλ€.
κ°μ μ κ±°λ¦¬κ° κ°μ μμ μ λμκ°μ μνλ μ μκΈ° λλ¬Έμ λμλΉκ΅λ₯Ό ν΅ν΄ κ°μ λ£μ΄μ€λ€.
μ€μν건 v[cur].edgesλ₯Ό ν΅ν΄ 보λ μμ λ€μ 무쑰건 νμ¬ μμ κ³Ό κ±°λ¦¬κ° κ°μ νλλ°μ μλλ€λ κ²μ΄λ€.
for(int i=1; i<=N; i++){
int cur = q.front();
q.pop();
arr[cur] += v[cur].time;
for(auto e : v[cur].edges){
v[e].num -= 1;
if(v[e].num == 0)
q.push(e);
if(arr[e] < arr[cur]) arr[e] = arr[cur];
}
}
μ 체 μ½λ
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int N, arr[10001], ans;
queue<int>q;
struct p{
int time;
vector<int>edges;
int num;
};
vector<p>v(10001);
int main(){
cin>>N;
for(int i=1; i<=N; i++){
int time, s_num;
cin>>time>>s_num;
if(s_num == 0) q.push(i);
v[i].time = time;
v[i].num = s_num;
for(int j=0; j<s_num; j++){
int s;
cin>>s;
v[s].edges.push_back(i);
}
}
for(int i=1; i<=N; i++){
int cur = q.front();
q.pop();
arr[cur] += v[cur].time;
for(auto e : v[cur].edges){
v[e].num -= 1;
if(v[e].num == 0)
q.push(e);
if(arr[e] < arr[cur]) arr[e] = arr[cur];
}
}
for(int i=1; i<=N; i++)
ans = max(ans, arr[i]);
cout<<ans;
}