반응형

https://www.acmicpc.net/problem/1057


시뮬레이션


문제

김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를 한다. 이긴 사람은 다음 라운드에 진출하고, 진 사람은 그 라운드에서 떨어진다. 만약 그 라운드의 참가자가 홀수명이라면, 마지막 번호를 가진 참가자는 다음 라운드로 자동 진출한다. 다음 라운드에선 다시 참가자의 번호를 1번부터 매긴다. 이 때, 번호를 매기는 순서는 처음 번호의 순서를 유지하면서 1번부터 매긴다. 이 말은 1번과 2번이 스타를 해서 1번이 진출하고, 3번과 4번이 스타를 해서 4번이 진출했다면, 4번은 다음 라운드에서 번호 2번을 배정받는다. 번호를 다시 배정받은 후에 한 명만 남을 때까지 라운드를 계속 한다.


마침 이 스타 대회에 임한수도 참가했다. 김지민은 갑자기 스타 대회에서 우승하는 욕심은 없어지고, 몇 라운드에서 임한수와 대결하는지 궁금해졌다. 일단 김지민과 임한수는 서로 대결하기 전까지 항상 이긴다고 가정한다. 1 라운드에서 김지민의 번호와 임한수의 번호가 주어질 때, 과연 김지민과 임한수가 몇 라운드에서 대결하는지 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 참가자의 수 N과 1 라운드에서 김지민의 번호와 임한수의 번호가 순서대로 주어진다. N은 100,000보다 작거나 같은 자연수이고, 김지민의 번호와 임한수의 번호는 N보다 작거나 같은 자연수이고, 서로 다르다.


code >>


#include<stdio.h>

int main()

{

int count, k, i, round = 1;

scanf("%d %d %d", &count, &k, &i);

while (count > 0)

{

if ((k & 1) == 0 && k - 1 == i)

break;

else if ((k & 1) == 1 && k + 1 == i)

break;

if ((i & 1) == 1 && i + 1 == k)

break;

else if ((i & 1) == 0 && i - 1 == k)

break;

count = count / 2 + (count % 2);

k = k / 2 + (k % 2);

i = i / 2 + (i % 2);

round++;

}

printf("%d\n", round);

  return 0;

}

반응형

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

2178>미로탐색  (0) 2018.04.01
1934, 13241>최소공배수  (0) 2018.03.24
9461>파도반 수열  (2) 2018.03.17
1912>연속합  (0) 2018.03.17
7569>토마토  (0) 2018.03.10
반응형

https://www.acmicpc.net/problem/1094


시뮬레이션


문제

지민이는 길이가 64cm인 막대를 가지고 있다. 어느날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만드려고 한다.


막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.


지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이 때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.

가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.

만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.

이제, 남아있는 모든 막대를 풀로 붙여서 Xcm를 만든다.

X가 주어졌을 때, 위의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 구하는 프로그램을 작성하시오. 


입력

첫째 줄에 X가 주어진다. X는 64보다 작거나 같은 자연수이다.


code>>


#include <stdio.h>

int main()

{

int input;

scanf("%d", &input);

int stick = 64;

int count = 0;

int sum = 0;

while (stick > 0)

{

if (sum + stick <= input)

{

count++;

sum += stick;

if (sum == input) break;

}

stick /= 2;

}

printf("%d", count);

    return 0;

}



반응형

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

2156>포도주 시식  (0) 2018.02.26
1932>숫자 삼각형  (0) 2018.02.15
2455>지능형 기차  (0) 2018.02.04
2579>계단 오르기  (0) 2018.01.27
2965>캥거루 세마리  (0) 2018.01.24
반응형
https://www.acmicpc.net/problem/2455

시뮬레이션

문제

최근에 개발된 지능형 기차가 1번역(출발역)부터 4번역(종착역)까지 4개의 정차역이 있는 노선에서 운행되고 있다. 이 기차에는 타거나 내리는 사람 수를 자동으로 인식할 수 있는 장치가 있다. 이 장치를 이용하여 출발역에서 종착역까지 가는 도중 기차 안에 사람이 가장 많을 때의 사람 수를 계산하려고 한다. 단, 이 기차를 이용하는 사람들은 질서 의식이 투철하여, 역에서 기차에 탈 때, 내릴 사람이 모두 내린 후에 기차에 탄다고 가정한다.


 

 내린 사람

탄 사람 

 1번역(출발) 

 0

 32

 2번역

 3

 13

 3번역

 28

 25

 4번역(종점) 39 0


예를 들어, 위와 같은 경우를 살펴보자. 이 경우, 기차 안에 사람이 가장 많은 때는 2번역에서 3명의 사람이 기차에서 내리고, 13명의 사람이 기차에 탔을 때로, 총 42명의 사람이 기차 안에 있다.


이 기차는 다음 조건을 만족하면서 운행된다고 가정한다.


기차는 역 번호 순서대로 운행한다.

출발역에서 내린 사람 수와 종착역에서 탄 사람 수는 0이다.

각 역에서 현재 기차에 있는 사람보다 더 많은 사람이 내리는 경우는 없다.

기차의 정원은 최대 10,000명이고, 정원을 초과하여 타는 경우는 없다.

4개의 역에 대해 기차에서 내린 사람 수와 탄 사람 수가 주어졌을 때, 기차에 사람이 가장 많을 때의 사람 수를 계산하는 프로그램을 작성하시오.


입력

각 역에서 내린 사람 수와 탄 사람 수가 빈칸을 사이에 두고 첫째 줄부터 넷째 줄까지 역 순서대로 한 줄에 하나씩 주어진다. 



code>>


#include<stdio.h>

int main()

{

int sum = 0 , max=0;

int input, output;

for (int i = 0; i < 4; i++)

{

scanf("%d %d", &output, &input);

sum -= output;

sum += input;

if (sum > max) max = sum;

}

printf("%d", max);


    return 0;

}


반응형

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

1932>숫자 삼각형  (0) 2018.02.15
1094>막대기  (0) 2018.02.04
2579>계단 오르기  (0) 2018.01.27
2965>캥거루 세마리  (0) 2018.01.24
2812>크게 만들기  (0) 2017.12.24

+ Recent posts