Candy+Sharing+Game

A number of students sit in a circle facing their teacher in the center. Each student initially has an even number of pieces of candy. When the teacher blows a whistle, each student simultaneously gives half of his or her candy to the neighbor on the right. Any student, who ends up with an odd number of pieces of candy, is given another piece by the teacher. The game ends when all students have the same number of pieces of candy.

Write a program which determines the number of times the teacher blows the whistle and the final number of pieces of candy for each student from the amount of candy each child starts with.

Input
The input may describe more than one game. For each game, the input begins with the number N of students,followed by N (even) candy counts for the children counter-clockwise around the circle. The input ends with a student count of 0. Each input number is on a line by itself.

Output
For each game, output the number of rounds of the game followed by the amount of candy each child ends up with,both on one line.

Sample Input
6

36

2

2

2

2

2

11

22

20

18

16

14

12

10

8

6

4

2

4

2

4

6

8

0

Sample Output
15 14

17 22

4 8

Hint

Notes:

The game ends in a finite number of steps because:

1. The maximum candy count can never increase.

2. The minimum candy count can never decrease.

3. No one with more than the minimum amount will ever decrease to the minimum.

4. If the maximum and minimum candy count are not the same, at least one student with the minimum amount must have their count increase

해석 : 선생님을 중심으로 동그랗게 아이들이 앉아있습니다. 아이들은 선생님의 휘슬이 불릴 떄 마다 오른쪽사람에게 자신이 가지고 있는 사탕의 반을 때어 줍니다. 이 행동은 동시에 일어납니다. 아이들이 가지고 있는 사탕의 개수는 짝수이며 오른쪽 사람에게 주었을 떄 남은게 홀수이면 선생님으로 부터 1개를 받아서 짝수로 맞추게됩니다. 그럼 몇번의 휘슬이 불리면 아이들은 같은 개수의 사탕을 가지게 될까요? 그리고 그때의 사탕의 개수는? 입력은 아이들의 인원수를 받고 그 인원수만큼의 사탕의 개수를 필요로합니다. 0을받으면 끝입니다. 아이들은 반시계방향으로 앉게되고 출력은 턴의 수와 사탕의 수를 출력하면 됩니다.

출처
[]

Source Code Java code format="java5" public class CandySharingGame{ public static void main(String[] args){ int[] candys = {2, 4, 6, 8}; int c = 0;

while(!isSame(candys)){ int[] temp = new int[candys.length];

for(int i = 0; i < candys.length; i++){ temp[i] = candys[i] / 2; candys[i] -= temp[i]; }

for(int i = 0; i < candys.length - 1; i++){ candys[i + 1] += temp[i]; }  candys[0] += temp[temp.length - 1];

for(int i = 0; i < candys.length; i++){ if(isOdd(candys[i])){ candys[i]++; }  }

c++; }

System.out.println(c + " " + candys[0]); }

// 홀수인지 확인하는 메소드 public static boolean isOdd(int n){ if((n % 2) != 0){ return true; } return false; }

// 배열의 요소가 모두 같은지 확인하는 메소드 public static boolean isSame(int[] n){ for(int i = 0; i < n.length - 1; i++){ if(n[i] != n[i + 1]){ return false; } }  return true; } } code

C++ code format="c"

#include

using namespace std;

bool IsAllSame(int arr[], int len) {   int t = arr[0]; for(int i = 0; i < len; i++) {   if(arr[i] != t)    { return false; }   }    return true; }

void MakeEven(int arr[], int len) {   for(int i = 0; i < len; i++) {   if(arr[i] % 2 != 0) {   arr[i]++; }   }    }

void PassHalf(int arr[], int len) {   for(int i = 0; i < len; i++) {   arr[i] /= 2; }   int* temp = new int[len]; temp[0] = arr[len - 1]; for(int i = 0; i < len - 1; i++) {   temp[i + 1] = arr[i]; }

for(int i = 0; i < len; i++) {   arr[i] += temp[i]; }

delete[] temp; }

int main {   int T;    cin >> T;

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

int *arr = new int[N];

for(int j = 0; j < N; j++) {   cin >> arr[j]; }

int count = 0;

MakeEven(arr, N); while(!IsAllSame(arr, N)) {   PassHalf(arr, N); MakeEven(arr, N);

count++; }

delete[] arr;

cout << count << endl; }   return 0; }

code

Comment