ACM题目与答案---J 下载本文

油漆金字塔

★问题描述

法老 Smith打算盖一座金字塔。为了避免金字塔受风吹日晒,他打算给金字塔刷上油漆。但是在当时,油漆还是比较稀有的东西,价格比较贵。 Smith希望在保证金字塔质量(即体积)的情况下,用尽量少的油漆。

身为建造官的你,需要帮法老解决这个问题。你请来了王国最好的数学家

身为建造官的你,需要帮法老解决这个问题。你请来了王国最好的数学家,设计了金字塔的结构图:

金字塔由N个长方体组成。每个长方体,高度为h,长度和宽度均为d。它们以顶部正方形的中心为轴心,层层叠加。为了保持金字塔稳定性,从下至上,每层长方体的高度和边长必需逐级递减,且为了计算方便,h和d均为正整数。

金字塔总体积为V,总面积为S(除金字塔最底部外的其他暴露在空气中的面积之和) 法老需要知道,在保证体积为M的基础上,最小的油漆面积S是多少。 ★实验任务

现请你写一个程庐,输出最小油漆面积。 ★数据输入

输入数据包括一行,为两个整数N(I≤n≤25)和V(≤m=5000),分别表示金字塔层数和总体积。输入保证该体积的金字塔是可以建造的 ★结果输出

輪出一行一个整整数,为最小油面积S 输入示例 3 36 #include #include

#Define INF 100000000 #Define Min(a, b)(a

int minv[25], mins[25]; void init() {

minv[0]=0; mins[0]=0;

for(int i=1; i<=M; i++)

输出示例 65 {

minv[i]= minv[i-1]+i*i*i; mins[i]=mins[i-1]+4*i*i; } }

void dfs(int m, int v, int s, int d, int h) {

if(m==0) {

if(ans>s&&v==N) ans=s; }

if(s+mins[m-1] > ans || v + minv[m-1]> N || 4*(N-v)/d+s >=ans) return; for(int i=d-1; i>=m; i--) {

int maxh= Min((N-v-minv[m-1])/(i*1),h-1); for(int j=max; j>=m; j--) {

if(m==M) S=i*i;

dfs(m-1,v+i*i*j,S+4*i*j,i,j); } } }

int main() {

scanf(\ ans=INF; init();

dfs(M,0,0,N+1,N+1); printf(\ return 0; }

冰桶挑战

Z大也兴起了一股冰桶挑战之风,参加过的人将会请自己的好友一起参加,并如此继线下去. 实验任务

已知一个N*M的关系图,每人相邻的四个方向上的人表示他的好友。希望价你能找到最后参加冰桶挑战的人 输入数据就一行

有4个正数N,M和X,Y(1<=N,M,X,Y<=100),表示关系图是N行M列的,并且第一个参加冰桶挑战的人位上(X,Y)

输出

轴出最后参加冰桶战的人位于关系图的位置,若有多个则先按X从小到大,X相同则按Y从小到大 输入示例 3 3 2 2 输出示例 1 1 1 3 3 1 3 3 3 3 3 3 1 1 #include

double fun(int a, int b, int x, int y) {

double c;

c=(x-a)*(x-a)+(y-b)*(y-b); return c; }

int main() {

int N, M,X, Y;

cin >>N>>M>>X>>Y; double d1, d2, d3, d4; d1=fun(1,1,X,Y); d2=fun(1, M, X, Y); d3=fun(N, 1, X, Y); d4=fun(N, M, X, Y); i(N==1) {

if(d1>d2)

cout<

cout<

cout<

if(M==1&&N!=1) {

if(d1>d3)

cout<

cout<