求以(0,0)为左上坐标第k大子矩形面积大小A-An Easy Problem_GDCPC广东省大学生程序设计竞赛(正式赛) (nowcoder.com)
时间复杂度:
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
int main(){
long long n,m,k;
scanf("%lld %lld %lld",&n,&m,&k);
priority_queue<pair<long long,long long>> q;//大根堆自动排序
for(long long i=1;i<=n;i++){
q.push({i*m,i});//枚举每行依次放入队列
}
for(long long i=1;i<k;i++){
auto t=q.top(); q.pop();
long long s=t.fi,d=t.se;
s=s-d;
q.push({s,d});//找到最大的面积减去他一列的格子并放入
}
auto res=q.top();//第k大的子矩形面积
long long num=res.fi;
printf("%lld\n",num);
return 0 - 0;
}
求以(0,0)为左上坐标第k小子矩形面积大小
#include<bits/stdC++.h>
using namespace std;
const int N = 1e6+6;
long long n,m,k;
bool check(long long x){
long long res=0;//找到每一行能填进去的数的个数
for(int i=1;i<=n;i++) res+=min((long long)m,x/i);
if(res>=k) return true;
return false;
}
int main(){
scanf("%lld %lld %lld",&n,&m,&k);
long long l=1,r=n*m;
while(l<r){
long long mid=(l+r)>>1;//二分答案枚举
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%lld\n",l);
return 0 - 0;
}