题意:给n个学生安排住宿,条件是每个学生所分配的面积至少为6平米,给你学生数n及现有的房子面积a*b。可以从任何边扩展,问扩展后的满足条件的最小面积及边长。
思路:按边暴力
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stdlib.h>
#include <string.h>
#define N 1000010
#define INF 1000000000000
#define LL long long
#define eps 10E-9
#define mem(a) memset(a,0,sizeof(a))
#define w(a) while(a)
#define s(a) scanf("%lld",&a)
#define ss(a,b) scanf("%lld%lld",&a,&b)
#define sss(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
using namespace std;
struct node
{
LL x,y,sum;
} h[N];
bool cmp(node x,node y)
{
return x.sum<y.sum;
}
LL n,i,j,a,b,c,s,a1,b1;
LL top=0;
int main()
{
sss(n,a,b);
if(a*b>=6*n)
{
cout<<a*b<<endl;
cout<<a<<" "<<b<<endl;
}
else
{
for(j=b;; j++)
{
if(j-b>100000)
break;
i=6*n/j;
if(b*i==6*n)
i=6*n/j;
else
for(i=6*n/j;; i++)
{
if(i*j>=6*n)
break;
}
if(i<a)
break;
h[top].sum=i*j;
h[top].x=i,h[top++].y=j;
}
for(j=a;; j++)
{
if(j-a>100000)
break;
i=6*n/j;
if(j*i==6*n)
i=6*n/j;
else
for(i=6*n/j;; i++)
{
if(i*j>=6*n)
break;
}
if(i<b)
break;
h[top].sum=i*j;
h[top].x=i,h[top++].y=j;
}
sort(h,h+top,cmp);
printf("%lld\n",h[0].x*h[0].y);
if(a>b&&h[0].x<h[0].y||a<b&&h[0].x>h[0].y)
swap(h[0].x,h[0].y);
printf("%lld %lld\n",h[0].x,h[0].y);
}
return 0;
}