(纪中)2174. 积木(block)

(File IO): input:block.in output:block.out
时间限制: 1000 ms 空间限制: 131072 KB 具体限制
Goto ProblemSet


题目描述
味味有一个 A × B × C A×B×C 的长方体积木,积木是有 1 × 1 × 1 1×1×1 的小积木块组成的。我们设定这个长方体的高为 A A ,宽为 B B ,长为 C C 。(为方便起见,长方体的长不一定要比宽的数值大)。
现在味味在这个长方体中的的左上角挖去了一个 ( A 1 ) × ( B 2 ) × ( C 2 ) (A-1)×(B-2)×(C-2) 的小长方体。并且告诉你被挖去长方体的体积为 n n ,即 n = ( A 1 ) × ( B 2 ) × ( C 2 ) n=(A-1)×(B-2)×(C-2) 。现在问你,被挖去小长方体后,原有长方体积木中剩下的 1 × 1 × 1×1× 的小积木块最少和最多分别是多少个。也就是说,在告诉你n值的前提下,求 m i n A × B × C n m a x A × B × C n min{A×B×C-n}和max{A×B×C-n}


输入
输入文件名为 b l o c k . i n block.in
输入共 1 1 行,仅一个正整数 n n

输出
输出文件名为 b l o c k . o u t block.out
输出共 1 1 行包含两个用空格隔开的正整数,依次表示最少剩余小积木块和最多剩余小积木块个数。


样例输入
【样例输入1】
4
【样例输入2】
7

样例输出
【样例输出1】
28 41
【样例输出2】
47 65


数据范围限制
对于 20 20 %的数据 1 n 400 1 ≤n≤400
对于 50 50 %的数据 1 n 1 0 6 1 ≤n≤10^6
对于 100 100 %的数据 1 n 1 0 9 1 ≤ n≤10^9


提示
样例1说明:
4 = ( 2 1 ) × ( 4 2 ) × ( 4 2 ) 4=(2-1)×(4-2)×(4-2) 最少剩余的小积木块为 2 × 4 × 4 4 = 28 2×4×4-4=28 (此时 A B C A,B,C 值分别为 2 4 4 2,4,4
$4=(5-1)×(3-2)×(3-2) $最多剩余的小积木块为 5 × 3 × 3 4 = 41 5×3×3-4=41 (此时 A B C A,B,C 值分别为 5 3 3 5,3,3


解题思路
较复杂的模拟,题目说什么就做什么。


代码

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n;
long long maxn,a[10000],t,minn;
int main(){
	freopen("block.in","r",stdin);
    freopen("block.out","w",stdout);
    scanf("%d",&n);
    maxn=8*n+9;
    for(int i=1;i<=sqrt(n);i++)
    {
    	if(n%i==0)
    	{
    		t++;
    		a[t]=i;
		}
		if((n/i)!=i)
		{
    		t++;
    		a[t]=n/i;
		}
	}
    minn=2147483647;
	for(int i=1;i<=t;i++)
	{
		for(int j=1;j<=t;j++)
		{
			if((a[i]*a[j]*(n/a[i]/a[j]))==n)
			{
				minn=min(((n/a[i]/a[j]+1)*(a[i]+2)*(a[j]+2)-n),minn);
			}
		}
	}
	printf("%d %d",minn,maxn);
}
发布了119 篇原创文章 · 获赞 8 · 访问量 4936

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/104601170
今日推荐