solution.md 2.6 KB
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
# 分巧克力
儿童节那天有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
```



## aop
### before
```cpp
#include <stdio.h>
#include <string.h>
int co[100100][2];

int coun(int n, int x)
{
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += (co[i][0] / x) * (co[i][1] / x);
    }
    return sum;
}

```
### after
```cpp
int main()
{
    int n;
    int k;
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++)
        scanf("%d%d", &co[i][0], &co[i][1]);
    printf("%d\n", binary(n, k));
}
```

## 答案
```cpp
int binary(int n, int k)
{
    int l = 0, r = 100000;
    while (l < r)
    {
        int mid = (r - l) / 2 + l;
        if (coun(n, mid) < k)
            r = mid - 1;
        else if (coun(n, mid) > k)
            l = mid + 1;
        else
            return mid;
    }
    return r;
}
```
## 选项

### A
```cpp
int binary(int n, int k)
{
    int l = 0, r = 100000;
    while (l < r)
    {
        int mid = (r - l) / 2 + l;
        if (coun(n, mid) < k)
            r = mid;
        else if (coun(n, mid) > k)
            l = mid;
        else
            return mid;
    }
    return r;
}
```

### B
```cpp
int binary(int n, int k)
{
    int l = 0, r = 100000;
    while (l < r)
    {
        int mid = (r - l) / 2 + l;
        if (coun(n, mid) > k)
            r = mid;
        else if (coun(n, mid) < k)
            l = mid;
        else
            return mid;
    }
    return r;
}
```

### C
```cpp
int binary(int n, int k)
{
    int l = 0, r = 100000;
    while (l < r)
    {
        int mid = (r - l) / 2 + l;
        if (coun(n, mid) > k)
            r = mid - 1;
        else if (coun(n, mid) < k)
            l = mid + 1;
        else
            return mid;
    }
    return r;
}
```