1. 程式人生 > >藍橋杯2017Java B組---分巧克力and承壓計算

藍橋杯2017Java B組---分巧克力and承壓計算

假設 ext package 電子 進行 兩個 兒童 最大 system.in

分巧克力

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);
}
}

藍橋杯2017Java B組---分巧克力and承壓計算