蓝桥杯 - 分巧克力

题目标题:分巧克力

儿童节那天有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

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 struct cho  //存储每个巧克力的长和宽 
 5 {
 6     int h;
 7     int w;
 8 };
 9 
10 int n,k;    //n是巧克力数,k是小朋友的个数 
11 
12 const int N=100005;
13 
14 cho c[N];
15 
16 bool judge(int len)
17 {
18     int sum=0; 
19     for(int i=1;i<n;i++)    //把1到n块巧克力可以分的数目加起来和小朋友总数对比 
20     {
21         sum+=(c[i].h/len)*(c[i].w/len);
22         if(sum>=k)
23         {
24             return true;
25         }
26     }
27     return false;
28 }
29 
30 int main()
31 {
32     freopen("input.txt","r",stdin);
33     scanf("%d%d",&n,&k);
34     for(int i=0;i<n;i++)
35     {
36         scanf("%d%d",&c[i].h,&c[i].w);
37     }
38     
39     int low=0;
40     int high=100005;
41     
42     int mid;
43     
44     while(low<high-1)
45     {
46         mid = (low + high)/2;
47         
48         if(judge(mid))
49             low=mid;
50         else
51             high=mid;
52     }
53     printf("%d\n",mid);
54     
55     return 0;   
56 }

 

posted @ 2019-03-20 17:51  WindSun  阅读(392)  评论(0编辑  收藏  举报
博客已停更,文章已转移,点击访问