zoukankan      html  css  js  c++  java
  • 蓝桥杯 历届试题 PREV-32 分糖果

    历届试题 分糖果  
    时间限制:1.0s   内存限制:256.0MB
    问题描述
      有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

      每个小朋友都把自己的糖果分一半给左手边的孩子。

      一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。

      反复进行这个游戏,直到所有小朋友的糖果数都相同为止。

      你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
    输入格式
      程序首先读入一个整数N(2<N<100),表示小朋友的人数。
      接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
    输出格式
      要求程序输出一个整数,表示老师需要补发的糖果数。
    样例输入
    3
    2 2 4
    样例输出
    4
     
    示例代码:
     1 import java.io.BufferedReader;
     2 import java.io.IOException;
     3 import java.io.InputStreamReader;
     4 
     5 public class Main {
     6     private static int m;
     7     private static int[] sweetsNum;
     8     private static int addNum;     //增加的糖果数
     9     public static void main(String[] args) throws NumberFormatException, IOException {
    10         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    11         m = Integer.parseInt(br.readLine());
    12         
    13         sweetsNum = new int[m];
    14         String[] str = br.readLine().split(" ");
    15         for(int i = 0; i < m; i++){
    16             sweetsNum[i] = Integer.parseInt(str[i]);
    17         }
    18         
    19         candy(m,sweetsNum);
    20         
    21         System.out.println(addNum);
    22     }
    23     
    24     /**
    25      * 分糖果
    26      * @param m    学生个数
    27      * @param sweetsNum  每个学生的糖果数
    28      */
    29     private static void candy(int m, int[] sweetsNum) {
    30         while(true){
    31             if(equal(sweetsNum)){
    32                 return;
    33             }else{
    34                 //每个小朋友都把自己的糖果分一半给左手边的孩子
    35                 int temp = sweetsNum[0];
    36                 for(int i = 0; i < sweetsNum.length-1; i++){
    37                     sweetsNum[i] = sweetsNum[i+1]/2 + sweetsNum[i]/2; 
    38                 }
    39                 sweetsNum[sweetsNum.length-1] = temp/2 + sweetsNum[sweetsNum.length-1]/2;
    40                 
    41                 //老师给奇糖果数的孩子补糖果
    42                 for(int i = 0; i < sweetsNum.length; i++){
    43                     if(sweetsNum[i]%2 != 0){
    44                         addNum++;            //记录补的糖果数的数目
    45                         sweetsNum[i]++;
    46                     }
    47                 }
    48             }
    49         }
    50     }
    51     
    52     /**
    53      * 判断所有学生手中的糖果数是否相等
    54      * @param sweetsNum  每个学生的糖果数
    55      * @return 相等返回true,否则返回false
    56      */
    57     private static boolean equal(int[] sweetsNum) {
    58         int n = 0;
    59         for(int i = 1; i < sweetsNum.length; i++){
    60             if(sweetsNum[i] == sweetsNum[0]){
    61                 n++;
    62             }
    63         }
    64         if(n == sweetsNum.length-1){
    65             return true;
    66         }
    67         return false;
    68     }
    69 }
  • 相关阅读:
    Python 处理时间的模块
    C# 委托在线程与UI界面之间的应用
    C# 自己动手实现Spy++(二)
    C# 自己动手实现Spy++(一)
    VS2008自定义快捷键设置
    C#深入解析委托——C#中为什么要引入委托
    C# 线程 在 sleep,suspend 之后 Abort 的方法
    C#多线程学习笔记之(abort与join配合使用)
    使用命名管道的OVERLAPPED方式实现非阻塞模式编程 .
    C++和C#进程之间通过命名管道通信(上)
  • 原文地址:https://www.cnblogs.com/cao-lei/p/6628317.html
Copyright © 2011-2022 走看看