【打表出来】poj 2363 Blocks

借鉴网上,这题有两种解法,如果不打表,就会超时,但是打表可以行。。。

然后就是用网上看到的方法优化,当然法二会好一些。。。

题意:给出边长为1的立方体的体积,对其进行包装,求出组合出最小的表面积。

设A*B*C==N,我们可以枚举A={1........N};B={1..........N};C={1..........N};求出最小的值给ANS「N」;

用到ANS「N」时直接打印就可以了

打表:

#include <stdio.h>

const int INF=0x7fffffff;
int ans[1001];

inline int min(int a,int b){return a<b?a:b;}

void getans()
{
    int i,j,k;
    for(i=1;i<1001;i++)
		ans[i]=INF;

    for(i=1;i<1001;i++)
    {
		for(j=1;j<1001;j++)
		{
			if(i*j>1000)
				break;

			for(k=1;k<1001;k++)
			{
				if(i*j*k>1000)
					break;
				ans[i*j*k]=min(ans[i*j*k],(i*j+j*k+k*i)<<1);
			}
		}
    }
}

int main()
{
    int n,C;
    getans();

    scanf("%d",&C);

    while(C--)
    {
		scanf("%d",&n);
		printf("%d\n",ans[n]);
    }
    return 0;
}

另外,还可以这样写:

#define min(a,b) a<b?a:b
#define INF 1<<30

思路二:原来在heu做过,三重循环肯定超时,两重循环也有个优化,表面积 = 2*(a*b+a*c*b*c);  当a b c 最接近的时候(a=b=c),也就是立方体的时候是最小的表面积,所以对两个边循环的时候,可以先把V开三次方并向上取整,然后向两边枚举边长。

#include<iostream>
#include<cmath>
using namespace std;
int main() {
    int T , V;
    scanf("%d",&T);
    while (T --) {
        scanf("%d",&V);
        int l = ceil(pow(V , 1.0/3));
        bool flag = 0;
        int i , j , k;
        int minn = 2*(1 + V + V);
        for (i = l ; i > 0 ; i --)
          for (j = l ; j <= V ; j ++) {
            if (V%(i*j) == 0) {
                k = V/(i*j);
                minn = 2*(i*j+i*k+j*k)<minn?2*(i*j+i*k+j*k):minn;
            }
          }
          printf("%d\n",minn);
    }
}

或者直接打表出来:

#include <stdio.h>

int a[]={6,10,14,16,22,22,30,24,30,34,46,32,54,46,46,40,70,42,78,48,62,70,94,52,70,82,54,64,118,62,126,64,94,106,94,66,150,118,110,76,166,82,174,96,78,142,190,80,126,90,142,112,214,90,142,100,158,178,238,94,246,190,102,96,166,122,270,144,190,118,286,108,294,226,110,160,190,142,318,112,126,250,334,122,214,262,238,148,358,126,222,192,254,286,238,128,390,154,150,130,406,182,414,172,142,322,430,144,438,174,302,144,454,202,286,240,174,358,286,148,286,370,334,256,150,162,510,160,350,202,526,178,318,406,174,220,550,242,558,166,382,430,334,168,358,442,182,304,598,170,606,244,222,226,382,206,630,478,430,184,382,198,654,336,206,502,670,188,390,258,246,352,694,302,190,208,478,538,718,192,726,262,494,292,454,322,430,384,222,286,766,208,774,586,238,210,790,234,798,210,542,610,478,262,502,622,294,240,478,214,846,432,574,646,526,216,510,658,590,238,502,382,894,232,230,682,910,290,918,342,262,364,934,270,574,480,638,334,958,236,966,330,270,496,238,422,558,388,670,250,1006,240,574,766,302,256,1030,442,606,274,366,790,1054,268,646,370,718,544,1078,258,1086,304,302,826,270,346,1110,838,390,262,1126,482,1134,576,334,382,670,264,646,426,782,592,1174,266,718,460,318,898,670,280,702,910,814,336,742,342,1230,298,830,454,1246,308,1254,946,286,640,1270,542,718,288,862,442,718,288,310,982,878,508,766,302,1326,672,462,1006,814,292,1350,442,910,346,766,378,294,532,398,1042,1390,430,1398,310,366,328,1414,602,862,720,382,1078,1438,312,798,1090,374,342,886,622,1470,400,510,538,862,458,1494,486,350,580,838,318,1518,382,1022,1150,1534,320,334,1162,534,784,1558,346,862,322,1054,1186,958,336,1590,1198,422,340,1606,682,894,816,342,550,910,388,1638,594,1102,832,958,450,1006,376,1118,538,1678,344,1686,1270,582,652,390,722,990,864,430,622,1726,348,1734,586,494,880,958,742,1758,366,350,562,1774,542,1078,1342,1198,352,1798,370,1006,912,1214,1366,382,428,1830,1378,462,454,1846,370,1854,496,526,1402,1870,384,1086,678,1262,724,1054,802,430,430,654,1438,1918,376,1062,1450,502,418,1174,378,1950,748,1310,378,1966,598,1078,622,398,528,1150,842,1998,400,1342,1510,2014,382,1222,642,494,1024,2038,434,1182,384,510,1546,1246,626,1150,694,1390,418,2086,558,2094,1056,430,1582,1150,404,1150,762,726,474,1174,902,1294,820,1438,1618,406,408,2166,1630,1454,472,1318,422,2190,1104,750,430,1198,508,1278,1666,622,1120,2230,594,1230,412,542,1690,2254,682,1366,1702,414,868,2278,478,2286,478,1534,766,510,416,2310,714,1550,562,1342,982,1294,892,454,1762,2350,434,1278,846,1582,624,2374,438,478,1200,1598,742,2398,440,2406,802,822,1216,462,1022,2430,520,622,874,1342,480,2454,1846,686,442,2470,1042,2478,598,606,1870,1438,460,550,1882,598,1264,1366,446,2526,964,1694,1906,1534,766,462,798,870,448,2566,1082,2574,562,718,790,2590,450,1438,490,662,1312,2614,1102,1582,688,894,874,2638,472,2646,1990,622,1012,526,702,1438,1344,1790,958,1486,472,2694,2026,510,546,2710,1142,1566,522,1822,850,2734,528,1654,490,1838,720,1510,566,2766,1392,478,2086,1678,628,1510,2098,1870,480,2806,498,1518,480,782,2122,1630,850,2838,1014,966,1084,1534,526,526,1440,1918,2158,2878,484,1662,874,1934,1456,630,506,2910,502,486,1042,1582,878,2934,2206,518,616,1630,774,2958,706,686,982,2974,668,1798,2242,1014,598,1726,550,3006,784,2014,922,1822,510,3030,2278,710,574,3046,1282,1758,1536,566,2302,1678,512,3078,514,2062,1552,3094,810,670,1180,782,2338,1678,536,1726,942,750,532,1894,1322,3150,1584,2110,1126,1822,518,1734,2386,878,1600,3190,578,1726,520,1086,2410,1774,962,622,982,2158,1228,3238,522,3246,694,2174,1006,1966,572,1758,2458,542,778,3286,1382,3294,1252,590,1090,3310,624,3318,1182,2222,544,574,1402,2014,658,798,2518,3358,548,1798,2530,2254,1696,598,882,550,880,2270,610,1822,1018,3414,1126,622,1300,3430,574,3438,814,862,2590,3454,552,2086,2602,782,738,1918,698,1902,1324,1182,1042,670,1046,3510,2638,2350,556,3526,574,3534,682,974,2662,3550,788,2046,1266,558,1792,1918,1502,2158,576,814,2698,1918,560,1942,1110,902,1372,2182,1522,3630,1824,1230,582,3646,628,2014,2746,1006,1840,2110,618,3678,678,2462,2770,2014,586,790,2782,1254,760,3718,742,630,1872,2494,2806,654,586,3750,1234,2510,886,3766,1582,2014,976,606,1162,3790,1130,2070,670,2542,622,3814,990,2302,1920,878,2878,2206,592,2046,1162,1302,1936,2326,682,3870,594,862,1378,3886,594,2238,2926,670,1008,3910,1642,2158,616,1326,2950,3934,868,2374,1170,982,750,2110,598,3966,808,2654,1306,2398,1186,3990,2998,942,600};

int main()
{
	int C;
	int N;
	scanf("%d",&C);

	while(C--)
	{
		scanf("%d",&N);
		printf("%d\n",a[N-1]);
	}

	return 0;
}

打表程序是:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int cal(int a, int b, int c)
{
    return (a * b + b * c + c * a) * 2;
}

int work(int a)
{
    int ans = 1000000000;
    for (int i = 1; i * i * i <= a; i++)
        for (int j = i; i * j * j <= a; j++)
        {
            int k = a / i / j;
            if (i * j * k == a && cal(i, j, k) < ans)
                ans = cal(i, j, k);
        }
    return ans;
}

int main()
{
    freopen("t.txt", "w", stdout);
    for (int i = 1; i <= 1000; i++)
    {
        printf("%d,", work(i));
    }
    return 0;
}
时间: 2024-08-29 12:52:20

【打表出来】poj 2363 Blocks的相关文章

POJ题目分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

poj分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

poj 题型分类

主流算法: 1.搜索 //回溯 2.DP(动态规划) 3.贪心 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同等安置矩形的并的面积与周长 7.组合数学 //Polya定理 8.模拟 9.数据结构 //并查集.堆 10.博弈论 1. 排序 1423, 1694, 1723, 1727, 1763, 1788, 1828, 1838, 1840, 2201, 2376, 2377, 2380, 1318, 1877, 1928, 1971,

hduoj题目分类

基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093.1094.1095.1096.1097.1098.1106.1108.1157.1163.1164.1170.1194.1196.1197.1201.1202.1205.1219.1234.1235.1236.1248.1

ACM练级

一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的 ,主要时间是花在思考算法上,不是花在写程序与debug上.  下面给个计划你练练: 第一阶段: 练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打 出来.  1.最短路(Floyd.Dijstra,BellmanFord)  2.最小生成树(先写个prim,kruscal要用并查集,不好写)  3.大数(

A题常用数据结构

  基本结构 高级结构 题单 集合结构   幷查集 POJ 1182 POJ 1308 POJ 1611 POJ 1986 POJ 1988 线性结构 数组 栈 队列 双端队列 POJ POJ POJ POJ POJ 树状结构 二叉树 BST AVL树 splay树(伸展树) Treap Cartesian Tree Size Balance Tree POJ 3580(splay tree) POJ 2761(Treap) POJ 2201(Cartesian Tree) POJ 3481(S

【sql调优】动态采样

1. Dynamic Sampling (动态采样)    The purpose of dynamic sampling is to improve server performance by determining more accurate selectivity and cardinality estimates.    More accurate selectivity and cardinality estimates allow the optimizer to produce b

解析10053事件

  转自http://hi.baidu.com/%C8%FD%B7%C9%D4%C6/blog/item/4bdbbb501278f565843524c1.html         你是否想知道一句sql语句如何执行,它是否走索引,是否采用不同得驱动表,是否用nestloop join,hash join-..?这一切对你是否很神秘呢?或许你会说execution plan能看到这些东西,但是你是否清楚execution plan是如何得到?这篇文章就是给出了隐藏在execution plan底

POJ 3761 Bubble Sort:用反序表分析排列数

http://poj.org/problem?id=3761 1. 先介绍反序表的概念: 令bi(1<=i<=n)为位于i左边但是大于i的元素个数,就能得到排列a1,a2,...,an的反序表b1,b2,...,b3 比如说,排列 5 9 1 8 2 6 4 7 3 有反序表 2 3 6 4 0 2 2 1 0(在1左边且大于1的有2个,在2左边且大于2的有3个,--) 2. 关键结论: 由1知,第1个元素的反序数取值范围是[0,n-1],第i个元素的反序数取值范围是[0,n-i],最后一个元