zoukankan      html  css  js  c++  java
  • 蓝桥杯2017Java B组---分巧克力and承压计算

    分巧克力

    package lala;

    /*
    *儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
        小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。
        为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:
        1. 形状是正方形,边长是整数  
        2. 大小相同  
    例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。
    当然小朋友们都希望得到的巧克力尽可能大,你能帮小Hi计算出最大的边长是多少么?
    输入
    第一行包含两个整数N和K。(1 <= N, K <= 100000)  
    以下N行每行包含两个整数Hi和Wi。(1 <= Hi, Wi <= 100000) 
    输入保证每位小朋友至少能获得一块1x1的巧克力。   
    输出
    输出切出的正方形巧克力最大可能的边长。
    样例输入:
    2 10  
    6 5  
    5 6  
    样例输出:

    2
    */

    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    int n, k;
    int[] h = new int[100000];
    int[] w = new int[100000];
    Scanner sc = new Scanner(System.in);
    n = sc.nextInt();
    k = sc.nextInt();
    for (int i = 0; i < n; ++i) {
    h[i] = sc.nextInt();
    w[i] = sc.nextInt();
    }

    int r = 100001;
    int l = 1;
    int ans = 0;
    while (l <= r) {
    int mid = (l + r) / 2;

    int cnt = 0;

    for (int i = 0; i < n; ++i) {
    cnt += (h[i] / mid) * (w[i] / mid);
    }
    if (cnt >= k) {
    l = mid + 1;
    ans = mid;
    } else {
    r = mid - 1;
    }
    }
    System.out.println(ans);
    }
    }

    测试了一下,运行超时。。。

    承压计算

    package lala;
    /*
    * X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。
    每块金属原料的外形、尺寸完全一致,但重量不同。
    金属材料被严格地堆放成金字塔形。
                                 {7 },
                                {5 ,8} ,
                               {7, 8,8 },
                              {9, 2, 7, 2}, 
                             {8, 1,4, 9, 1 },
                            {8, 1 ,8,8 ,4,1 },
                           {7, 9, 6 ,1, 4 ,5, 4}, 
                          {5, 6, 5, 5, 6, 9 ,5, 6}, 
                         {5,5, 4, 7, 9, 3, 5, 5,1 },
                        {7, 5 ,7, 9, 7, 4, 7, 3, 3,1}, 
                       {4, 6,4, 5, 5, 8 ,8, 3, 2, 4, 3}, 
                      {1 ,1 ,3 ,3 ,1 ,6 ,6 ,5, 5, 4, 4, 2}, 
                     {9 ,9 ,9 ,2 ,1 ,9 ,1 ,9 ,2 ,9 ,5 ,7 ,9}, 
                    {4 ,3 ,3 ,7, 7, 9, 3, 6, 1, 3, 8, 8, 3, 7}, 
                   {3 ,6 ,8 ,1 ,5 ,3 ,9 ,5 ,8 ,3 ,8 ,1 ,8 ,3 ,3}, 
                  {8 ,3 ,2 ,3, 3, 5, 5, 8, 5, 4, 2, 8 ,6 ,7 ,6, 9}, 
                 {8 ,1 ,8 ,1 ,8 ,4 ,6 ,2 ,2 ,1 ,7 ,9 ,4 ,2 ,3 ,3 ,4}, 
                {2 ,8 ,4 ,2 ,2 ,9 ,9, 2, 8, 3, 4, 9, 6, 3, 9, 4, 6, 9}, 
               {7 ,9 ,7 ,4 ,9 ,7 ,6 ,6 ,2 ,8 ,9 ,4 ,1 ,8 ,1 ,7 ,2 ,1 ,6}, 
              {9, 2, 8, 6, 4, 2, 7, 9 ,5 ,4, 1, 2, 5, 1, 7, 3, 9, 8, 3, 3}, 
             {5 ,2 ,1 ,6 ,7 ,9 ,3 ,2 ,8 ,9 ,5 ,5 ,6 ,6 ,6 ,2 ,1 ,8 ,7 ,9 ,9}, 
            {6 ,7 ,1 ,8 ,8 ,7, 5, 3, 6, 5, 4, 7, 3, 4, 6, 7, 8, 1, 3, 2, 7, 4}, 
           {2 ,2 ,6 ,3 ,5 ,3, 4 ,9 ,2 ,4 ,5 ,7 ,6 ,6 ,3 ,2 ,7 ,2 ,4 ,8 ,5 ,5 ,4}, 
          {7 ,4 ,4 ,5 ,8, 3, 3, 8, 1, 8, 6, 3, 2, 1, 6, 2, 6, 4, 6, 3, 8, 2, 9, 6}, 
         {1 ,2 ,4 ,1 ,3 ,3 ,5 ,3 ,4 ,9 ,6 ,3 ,8 ,6 ,5 ,9 ,1 ,5 ,3 ,2 ,6 ,8 ,8 ,5 ,3}, 
        {2 ,2 ,7, 9, 3, 3, 2, 8, 6, 9, 8, 4, 4, 9, 5, 8, 2, 6, 3, 4, 8, 4, 9, 3, 8, 8}, 
       {7 ,7 ,7 ,9 ,7 ,5 ,2 ,7 ,9 ,2 ,5 ,1 ,9 ,2 ,6 ,5, 3 ,9 ,3 ,5 ,7 ,3 ,5 ,4 ,2 ,8 ,9,},
      {7 ,7, 6, 6 ,8 ,7 ,5 ,5 ,8, 2, 4, 7, 7, 4, 7, 2, 6, 9, 2, 1, 8, 2, 9, 8, 5, 7, 3, 6} ,
     {5 ,9 ,4 ,5 ,5 ,7 ,5 ,5 ,6 ,3 ,5 ,3 ,9 ,5 ,8 ,9 ,5 ,4 ,1 ,2 ,6 ,1 ,4 ,3 ,5 ,3 ,2 ,4 ,1} 
    x   x   x  x  x  x  x  x  x  x   x   x  x  x  x  x  x  x  x  x  x  x   x   x  x  x  x  x   x   x
    其中的数字代表金属块的重量(计量单位较大)。
    最下一层的X代表30台极高精度的电子秤。
    假设每块原料的重量都十分精确地平均落在下方的两个金属块上,
    最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。
    电子秤的计量单位很小,所以显示的数字很大。
    工作人员发现,其中读数最小的电子秤的示数为:2086458231
    请你推算出:读数最大的电子秤的示数为多少?
    注意:需要提交的是一个整数,不要填写任何多余的内容。
    */
    import java.util.Arrays;
    import java.util.Scanner;

    public class 承压计算 {
      static long[][] arr = new long[30][30];

      public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      long factor = 1;//2的30次方
      for (int i = 0; i < 30; ++i) {
        factor <<= i;
      }

    //输入数据放入二维数组
      for (int i = 0; i < 29; ++i) {
        for (int j = 0; j <= i; ++j) {
          long a = sc.nextLong();
          arr[i][j] = a * factor;// 每个数据都乘以factor
        }
      }
    //自上而下处理a[i][j]*factor(2的30次方)-->除以2,计入a[i+1][j]和a[i+1][j+1]
    //循环处理第1~N-1行
      for (int i = 0; i < 29; ++i) {
        for (int j = 0; j <= i; ++j) {
        long ha = arr[i][j]/2;
        arr[i+1][j] += ha;
        arr[i+1][j+1] += ha;
      }
    }
    //对a[N-1]这一行进行排序,查看最小值和factor之间的倍数关系,决定最大值是多少
      Arrays.sort(arr[29]);
      System.out.println(arr[29][0]);
      System.out.println(arr[29][29]);
      System.out.println(arr[29][29]/(arr[29][0])/2086458231);
    }
    }

  • 相关阅读:
    单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件)(转)
    Android手机直播(三)声音采集
    Android 音视频去回声、降噪(Android音频采集及回音消除)(转)
    Android中Selector的setSelected“方法不管用”
    Github的快捷键
    哔哩哔哩视频显示在Github的Markdown博客页方法
    小巧的屏幕录像软件oCam
    win7各种插件的下载与使用
    3D 打印机选择说明文档
    在Ubuntu 18.04中安装Pycharm及创建Pycharm快捷方式
  • 原文地址:https://www.cnblogs.com/wlgzszgb/p/10585807.html
Copyright © 2011-2022 走看看