프로그래밍 알고리즘

[정올 2300] 용액

꾸준한사람 2023. 1. 7. 20:47
반응형

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1561&sca=99&sfl=wr_hit&stx=2300 

 

JUNGOL

 

www.jungol.co.kr

#include <stdio.h>

int N, Liq[100010], ansi, ansj, posbegin, negend;

void Input()
{
	int abssum = 9999999999, tmpsum;
	bool flag = false;
	posbegin = negend = -1;
	scanf("%d", &N);
	for (int i = 0; i < N; i++)
	{
		scanf("%d", Liq + i);
		if (flag == false && Liq[i] > 0)
		{
			posbegin = i;//양수 시작하는 인덱스
			flag = true;
		}
	}

	if (posbegin > 0)
	{//음수가 1개라도 있으면, 음수 end 인덱스를 결정해줌
		negend = posbegin - 1;
	}
}

#define GetAbsVal(a, b)	(a + b >= 0) ? (a + b) : (-(a + b))

void Cal()
{
	int abssum = 9999999999, tmpsum;

	if (posbegin == -1)	ansi = N - 2, ansj = N - 1;	//양수가 없는 경우 -> 마지막 2개가 답
	else if (negend == -1)	ansi = 0, ansj = 1; //음수가 없는 경우 -> 처음 2개가 답
	else
	{//둘 다 있는 경우 -> 계산
		for (int posi = posbegin, negi = negend; posi < N && negi >= 0;)
		{
			tmpsum = GetAbsVal(Liq[posi], Liq[negi]);
			if (abssum > tmpsum)	ansi = negi, ansj = posi, abssum = tmpsum;
			if (abssum == 0) return;
			if (Liq[posi] + Liq[negi] > 0)	negi--;
			else							posi++;
		}
	}
}

int main(void)
{
	Input();
	Cal();
	printf("%d %d", Liq[ansi], Liq[ansj]);

	return 0;
}
반응형

'프로그래밍 알고리즘' 카테고리의 다른 글

[정올 2467] 비용  (1) 2023.01.08
[정올 2461] 공주님의 정원  (0) 2023.01.08
[정올 2261] 경로 찾기  (0) 2023.01.07
[정올 2255] 섞기 수열  (0) 2023.01.07
[정올 2247] 도서관  (0) 2023.01.07