티스토리 뷰

SW Expert Academy :: SWEA :: 5648 :: 원자 소멸 시뮬레이션


출처 : https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRFInKex8DFAUo&categoryId=AWXRFInKex8DFAUo&categoryType=CODE


#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

 

struct atom {

    int n, i, j, d, e;

    float c;

};

 

int N, ans;

vector <atom> v;

vector <pair<float, pair<int, int>>> ev;

 

 

inline void check(atom n1, atom n2) {

if (n1.d == 0) {

if (n2.d == 1 && n1.j == n2.j && n1.i<n2.i) {

ev.push_back(make_pair(abs((n1.i - n2.i) / 2.0), make_pair(n1.n, n2.n)));

}

else if (n2.d == 3 && n2.i>n1.i && n2.j<n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {

ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));

}

else if (n2.d == 2 && n2.i>n1.i && n2.j>n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {

ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));

}

}

else if (n1.d == 1) {

if (n2.d == 0 && n1.j == n2.j && n1.i > n2.i) {

ev.push_back(make_pair(abs((n1.i - n2.i) / 2.0), make_pair(n1.n, n2.n)));

}

else if (n2.d == 3 && n2.i<n1.i && n2.j<n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {

ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));

}

else if (n2.d == 2 && n2.i<n1.i && n2.j>n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {

ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));

}

}

else if (n1.d == 2) {

if (n2.d == 3 && n1.i == n2.i && n1.j > n2.j) {

ev.push_back(make_pair(abs((n1.j - n2.j) / 2.0), make_pair(n1.n, n2.n)));

}

else if (n2.d == 0 && n2.i<n1.i && n2.j<n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {

ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));

}

else if (n2.d == 1 && n2.i>n1.i && n2.j<n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {

ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));

}

}

else if (n1.d == 3) {

if (n2.d == 2 && n1.i == n2.i && n1.j < n2.j) {

ev.push_back(make_pair(abs((n1.j - n2.j) / 2.0), make_pair(n1.n, n2.n)));

}

else if (n2.d == 1 && n2.i>n1.i && n2.j>n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {

ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));

}

else if (n2.d == 0 && n2.i<n1.i && n2.j>n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {

ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));

}

}

}


void input() {

v.clear(); ev.clear();

cin >> N; ans = 0; atom a;

for (int i = 0; i < N; i++) {

cin >> a.j >> a.i >> a.d >> a.e; a.c = 0; a.n = i;

v.push_back(a);

}

}


int main() {

std::ios::sync_with_stdio(false); cin.tie(0);

int T; cin >> T;

for (int tc = 1; tc <= T; tc++) {

input();


for (int i = 0; i < N - 1; i++) for (int j = i + 1; j < N; j++)check(v[i], v[j]);


if (ev.size() > 0) {

sort(ev.begin(), ev.end());

float num;

for (int i = 0; i < ev.size(); i++) {

num = ev[i].first;

if (!(v[ev[i].second.first].c != 0 && v[ev[i].second.first].c != num)

&& !(v[ev[i].second.second].c != 0 && v[ev[i].second.second].c != num)) {

v[ev[i].second.first].c = num; v[ev[i].second.second].c = num;

}

}

for (int i = 0; i < N; i++) if (v[i].c) ans += v[i].e;

}


cout << "#" << tc << " " << ans << endl;

}

return 0;

}



'알고리즘 > SWEA' 카테고리의 다른 글

[SWEA 5658] 보물상자 비밀번호  (0) 2018.09.21
[SWEA 5644] 무선 충전  (0) 2018.09.21
[SWEA 5650] 핀볼 게임  (0) 2018.09.19
[SWEA 5521] 상원이의 생일파티  (0) 2018.09.07
[SWEA 5436] 동욱이의 조판하기  (0) 2018.08.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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 31
글 보관함