Wonder Room

题意:给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;

}

时间: 2024-10-13 02:21:43