Blue Bridge Cup 이전 시험 문제: 사탕의 Java 구현

주제 설명

n명의 아이들이 원 안에 앉아 있습니다. 교사는 각 어린이에게 짝수 개의 사탕을 무작위로 배포한 후 다음 게임을 합니다.

각 어린이는 사탕의 절반을 왼쪽 어린이에게 나누어줍니다.
사탕을 한 바퀴 돌고 나면 교사는 홀수인 아이에게 사탕 1개를 주어 짝수가 되게 합니다.
모든 어린이가 같은 수의 사탕을 가질 때까지 이 게임을 반복합니다.
귀하의 임무는 알려진 초기 사탕 상황에서 교사가 재발행해야 하는 사탕의 수를 예측하는 것입니다.

입력하다

프로그램은 먼저 자식 수를 나타내는 정수 N(2< N< 100)을 읽습니다. 
그런 다음 공백으로 구분된 N개의 짝수 행이 있습니다(각 짝수는 1000보다 크지 않고 2보다 작지 않음). 

산출

프로그램은 교사가 재발행해야 하는 사탕의 수를 나타내는 정수를 출력해야 합니다.

샘플 입력

3 
2 2 4

샘플 출력

4

아이디어 분석:

우선, 이 질문을 보았을 때 나의 첫 반응은 재귀를 사용하는 것이었다. 매번 같은 내용을 실행해야 하므로 먼저 분할한 후 구성하여 동일 여부를 판단합니다.

그런 다음 코드를 작성하는 과정에서 몇 가지 문제에 주의를 기울여야 합니다.

1. 사탕을 왼쪽에서 오른쪽으로 나누기 뒤에서부터 앞으로, 처음부터 끝까지 사탕을 나눠주는 것으로 이해합니다. 이때 첫 번째 아이의 손에 든 사탕의 상태는 두 번째 아이에게 공유되었기 때문에 이 값을 직접 사용할 수 없기 때문에 새로운 배열 brr을 생성하고 brr=arr로 두면 우리는 할 수 있습니다. 실행 후 arr[0]을 대체하려면 brr[0]을 사용하십시오.

2. 배열의 각 값이 같은지 판단한 후 배열 arr이 이미 정렬된 상태임을 고려해야 합니다. 물론, 그것들이 같지 않다면, 이때 우리가 arr 배열을 다음 코드 실행 라운드로 가져오는 것은 불합리하므로 정렬하기 전에 brr 배열을 포맷해야 합니다. 이것은 arr 배열과 완전히 동일합니다. . 마지막으로 판단 후 arr 배열을 복원할 수 있습니다.

코드 표시:

import java.util.Scanner;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        int[] brr = new int[n];
        for (int i=0 ; i<n ; i++) {
            arr[i] = sc.nextInt();
            brr[i] = arr[i];
        }
        int count=0;
        System.out.println(ar(arr,brr,n,count));
    }

    public static int ar(int[] arr,int[] brr,int n,int count) {
        for (int i=0;i<n;i++) {  //转圈互分糖果
            if (i==(n-1)) {
//此时arr[0]已经是和arr[1]互分糖果后的数值,但是我们需要的是原始值,所以借用brr数组
                arr[i] = (arr[i]/2)+(brr[0]/2);
            } else {
                arr[i] = (arr[i]/2)+(arr[i+1]/2);
            }
        }
        for (int i=0;i<n;i++) {  //判断每个人手里的糖果是否为奇数
            if (arr[i]%2!=0) {
                arr[i] = arr[i]+1;
                count ++;
            }
//相当于格式化brr数组,因为我们需要用到brr[0]和下面对arr数组排序之后的恢复
            brr[i] = arr[i]; 
        }
// 对arr数组进行排序,如果收尾相等,则课判断该数组的每一个元素值都是相等的       
        Arrays.sort(arr);
// 如果相等,我们直接输出计数器       
        if (arr[0]==arr[n-1]) {
            return count;
        }
// 如果不相等,我们需要对排序之后的arr数组进行复原,然后循环执行
        for (int i=0;i<n;i++) {
            arr[i] = brr[i];
        }
        return ar(arr,brr,n,count);
    }
}

평가 상태:

 

추천

출처blog.csdn.net/aDiaoYa_/article/details/123589392