SACC2022
一、将一个长方体切成两个长方体,两个长方体的体积之差最小是多少?
-
思路:当长宽高有一个为偶数时,总可以切成两个相等的长方块,故最小体积差为0;当长宽高均为奇数时,切掉最长的一边,体积差大小等于其余两边的乘积
从最长边切除可以保证剩下两边形成的面积最小,而一个奇数必可以分为相差为1的两部分
-
官方solution
#include <bits/stdc++.h> using namespace std; int s[3]; int main() { scanf("%d%d%d", &s[0], &s[1], &s[2]); sort(s, s + 3); printf("%d\n", (s[0] & s[1] & s[2] & 1) ? s[0] * s[1] : 0); return 0; }
-
本人代码及不足之处
写算法时没有先从数学的方面简化算法而是一味枚举
#include <iostream> #include <math.h> using namespace std; int v(int, int, int); int main() { int a, b, c; cin >> a >> b >> c; int min=a*b*c; //切 长 for (int i = 1; i < a; i++) { if (abs(v(i, b, c) - v((a - i), b, c)) < min) min = abs(v(i, b, c) - v((a - i), b, c)); } for (int i = 1; i < b; i++) { if (abs(v(i, a, c) - v((b - i), a, c)) < min) min = abs(v(i, a, c) - v((b - i), a, c)); } for (int i = 1; i < c; i++) { if (abs(v(i, b, a) - v((c - i), b, a)) < min) min = abs(v(i, b, a) - v((c - i), b, a)); } cout << min << endl; } int v(int a , int b , int c) { return a * b * c; }
二、游戏在一个 3 x 3 的方格盘上进行,方格盘上的9 个空位可以填入整数。游戏开始时,方格盘上的(1,1),(2,1),(2,2) 将会各自填入一个随机的整数,咕咕将会尝试填充完剩下的六个位置。当每行、每列以及两个斜对角线的三数之和均相等时,游戏宣告结束。
-
思路:先用数学算出每个空格该填的表达式(关于已给整数)
-
官方solution:
记每行、每列以及两个斜对角线的三数之和为x ,那么九个格点之和恰为3x 。记(2,2) 的权值为 c。将经过 (2,2)的四条线叠加(4x ),则除了(2,2) 被统计了四次,其他八点均被统计了一次,可以看作是统计了所有的九个格点一次(3x )并统计了 三次( 3c)。即 4x=3x+c,得到 x=3c。当我们知道x 恰为c 的三倍,这样我们稍加计算即可知道其他格点的数值了。