搜索

SACC2022


发布时间: 2022-11-24 19:55:00    浏览次数:32 次

SACC2022

一、将一个长方体切成两个长方体,两个长方体的体积之差最小是多少?

  1. 思路:当长宽高有一个为偶数时,总可以切成两个相等的长方块,故最小体积差为0;当长宽高均为奇数时,切掉最长的一边,体积差大小等于其余两边的乘积

    从最长边切除可以保证剩下两边形成的面积最小,而一个奇数必可以分为相差为1的两部分

  2. 官方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;
    }
    
  3. 本人代码及不足之处

    写算法时没有先从数学的方面简化算法而是一味枚举

    #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) 将会各自填入一个随机的整数,咕咕将会尝试填充完剩下的六个位置。当每行、每列以及两个斜对角线的三数之和均相等时,游戏宣告结束。

  1. 思路:先用数学算出每个空格该填的表达式(关于已给整数)2fc002d1f6ee86ec4e262ee9e892e67

  2. 官方solution:

    记每行、每列以及两个斜对角线的三数之和为x ,那么九个格点之和恰为3x 。记(2,2) 的权值为 c。将经过 (2,2)的四条线叠加(4x ),则除了(2,2) 被统计了四次,其他八点均被统计了一次,可以看作是统计了所有的九个格点一次(3x )并统计了 三次( 3c)。即 4x=3x+c,得到 x=3c。当我们知道x 恰为c 的三倍,这样我们稍加计算即可知道其他格点的数值了。

免责声明 SACC2022,资源类别:文本, 浏览次数:32 次, 文件大小:-- , 由本站蜘蛛搜索收录2022-11-24 07:55:00。此页面由程序自动采集,只作交流和学习使用,本站不储存任何资源文件,如有侵权内容请联系我们举报删除, 感谢您对本站的支持。 原文链接:https://www.cnblogs.com/hithin/p/16923039.html