728x90
반응형
swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRDL1aeugDFAUo
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
#define MSIZE 105
#define ASIZE 10
struct Data {
int Y, X, C, P;//유저의 위치값 Y,X, 충전범위, 성능
}BC[ASIZE];
int BCidx = 0;
int userMap[2][MSIZE];//유저들의 경로 저장 배열
int dy[] = { 0,-1,0,1,0 };//이동 안함, 상, 우, 하, 좌
int dx[] = { 0,0,1,0,-1 };
int M, A;//총이동시간, BC의 개수
int ret;//결과값 저장
int user0Y,user0X,user1Y,user1X;//유저의 초기 위치
vector<int>u1; vector<int>u2;//유저 BC접속 확인
void init() {
//초기화
u1.clear(), u2.clear();
user0Y = 1, user0X = 1, user1Y = 10, user1X = 10;
memset(userMap, 0, sizeof(userMap));
memset(BC, 0, sizeof(BC));
M = A = 0;
ret = 0;
//입력
scanf("%d %d", &M, &A);
//유저 경로 배열 저장
for (int i = 0; i <= 1; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &userMap[i][j]);
}
}
//BC 정보 저장
for (int i = 0; i < A; i++) {
scanf("%d %d %d %d",&BC[i].X, &BC[i].Y, &BC[i].C, &BC[i].P);
}
}
void chkBC() {
for (int i = 0; i < A; i++) {//접속확인
int D = abs(user0Y - BC[i].Y) + abs(user0X - BC[i].X);
if (BC[i].C >= D) {//유저1이 범위에 들어가 있으면 저장
u1.push_back(i);
}
D = abs(user1Y - BC[i].Y) + abs(user1X - BC[i].X);
if (BC[i].C >= D) {//유저2가 범위에 들어가 있으면 저장
u2.push_back(i);
}
}
}
void userConnect(int num) {//접속 최대값 구하기
if (num == 1) {
int Max = 0x80000000;
for (int i = 0; i < u1.size(); i++) {// 유저1을 기준으로
if (Max < BC[u1[i]].P)Max = BC[u1[i]].P;//최대 접속가능
}
ret += Max;//최댓값 저장
}
if (num == 2) {
int Max = 0x80000000;
for (int i = 0; i < u2.size(); i++) {//유저2를 기준으로
if (Max < BC[u2[i]].P)Max = BC[u2[i]].P;//최대 접속가능
}
ret += Max;//최댓값 저장
}
if (num == 3) {
int Max = 0x80000000;
for (int i = 0; i < u1.size(); i++) {//두 유저가 접속가능한곳에서
for (int j = 0; j < u2.size(); j++) {
if (u1[i] != u2[j]) {
if (Max < BC[u1[i]].P + BC[u2[j]].P)Max = BC[u1[i]].P + BC[u2[j]].P;
}
else if (u1[i] == u2[j]) {
if (Max < BC[u1[i]].P )Max = BC[u1[i]].P;
}
}
}
ret += Max;//최댓값 저장
}
}
void Play() {
chkBC();//접속 가능 BC확인
if (u1.size() != 0 && u2.size() == 0) {//접속가능 유저1만 있는경우
userConnect(1);//접속 최대값 구하기
}
else if (u1.size() != 0 && u2.size() != 0) {//둘다 접속가능한경우
userConnect(3);//접속 최대값 구하기
}
else if (u1.size() == 0 && u2.size() != 0) {//접속가능 유저2만 있는경우
userConnect(2);//접속 최대값 구하기
}
}
void goUser() {
Play();//시작전 확인
for (int m = 0; m < M; m++) {//이동시작
u1.clear(); u2.clear();
user0X += dx[userMap[0][m]]; user0Y += dy[userMap[0][m]];
user1X += dx[userMap[1][m]]; user1Y += dy[userMap[1][m]];
Play();
}
}
int main(void) {
int T;//테스트케이스 개수
scanf("%d", &T);
for (int tc = 1; tc <= T; tc++) {
init();//초기화 및 입력
goUser();//유저 출발
printf("#%d %d\n", tc, ret);
}
return 0;
}
구역대로 동작하는것을 나누다 보니 좀 시간이 걸렸는데 한시간안에 해결한 문제 입니다.
우선 이것의 포인트는 최대값을 잘 뽑아내야하는것 입니다.
userConnect() 함수부분에 구현해놨으니 참고해주세요
속도는 마음에 드는군요 여러분들도 구역을 잘 나누고 특히 변수를 잘 구분해야합니다.
728x90
반응형
'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글
2105. [모의 SW 역량테스트] 디저트 카페 (0) | 2020.10.05 |
---|---|
2382. [모의 SW 역량테스트] 미생물 격리 (0) | 2020.09.26 |
백터에 같은 위치의 값 제거하기 (0) | 2020.09.26 |
5653. [모의 SW 역량테스트] 줄기세포배양 (0) | 2020.09.23 |
5648. [모의 SW 역량테스트] 원자 소멸 시뮬레이션 (0) | 2020.09.23 |
댓글