bjyb


私信TA

用户名:dotcpp0610982

访问量:1402

签 名:

等  级
排  名 2060
经  验 2390
参赛次数 0
文章发表 23
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:
随着要求分的边长越来越大,可以分出的巧克力呈现非递增趋势,故而答案具有单调性,可以二分答案。

对于每一个要求的边长,采用贪心的办法求得此边长可以分出的巧克力个数,对于每一个巧克力来说,顺次分可以是答案为最优的一种实现办法,从行来看,正方形的上下顶点肯定处于相距一致的列中,那么我们安排这些正方形相邻是最优的情况,如果我们不这样做,在上下界空出若干行,可能导致部分可以放入的正方形无法放入。列也是类似的情况。故而直接采用行除以正方形边长和列除以边长算的分出最多巧克力个数。
注意事项:
r设置为所有边长中最大的,l为1。
参考代码:

#include<bits/stdc++.h>
using namespace std;
#define maxx 200000
int l,r,n,k;
int all1[maxx];
int all2[maxx];
int check(int x)
{
  int qq=0;
  for(int i=1;i<=n;++i)
  qq+=((all2[i]/x)*(all1[i]/x));
  if(qq>=k) return 1;
  else  return 0;
}
signed main()
{
  cin>>n>>k;
  for(int i=1;i<=n;++i)
  {cin>>all1[i]>>all2[i];
   r=max(all1[i],r);
   r=max(all2[i],r);}
   l=1;
  while(l<r)
  {
    int mid=(l+r)/2;
    if(check(mid)) l=mid+1;
    else  r=mid;
  }
  if(check(l)) cout<<l;
  else cout<<l-1;
}


 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答

代码解释器

  评论区