第四章蛮力法作业

蛮力法(Brute Force)也称为穷举法,是一种简单直接的问题求解方法。蛮力法通常通过遍历所有可能的解空间,逐个检查每个可能的解,找到满足条件的解。

蛮力法的基本思想是通过穷尽所有可能的解,没有使用特定的优化技术或启发式算法。蛮力法的优点是简单直观,对于小规模的问题或者问题的解空间较小的情况下,可以得到正确的结果。蛮力法的缺点是其计算复杂度通常较高,随着问题规模的增大,解空间的大小呈指数级增长,计算量可能会变得非常大,因此在处理大规模问题时可能会效率较低。

蛮力法在实际应用中常用于以下情况:

  • 问题规模较小,解空间较小,蛮力法可以在合理的时间内找到解。
  • 作为一种暴力验证方法,用于验证其他复杂算法的结果的正确性。
  • 作为一种简单的问题求解方法,用于解决没有明显优化方法或者启发式算法的问题。

需要注意的是,对于大规模问题或者复杂问题,蛮力法可能不是最优的解决方法,因为其计算复杂度较高。在实际应用中,通常会结合其他更高效的算法和优化技术,以获得更好的求解效果。

一、求逆序数

给定一个整数数组 A=(a0,a1,…an-1),若 i<j 且 ai>aj,则<ai,aj>就为一个逆序
 对。例如数组(3 3,1,4,5,2)的逆序对有<3,1>,<3,2>,<4,2>,<5,2>。设计一
 个算法采用蛮力法求 A 中逆序对的个数即逆序数。

 代码实现

这个算法的思想很简单,就是使用两层循环,分别遍历数组中的每一对元素,并比较它们的大小。如果发现逆序对(即前一个元素大于后一个元素),则将计数器 count 加一。最终,count 的值就是整个数组中逆序对的个数。

然而,这种蛮力法算法的时间复杂度较高,为 O(n^2),其中 n 是数组的长度。对于大规模的数组,性能可能会比较差。在实际应用中,可以考虑使用更高效的排序算法,例如归并排序,来优化逆序对的计数过程,从而减少时间复杂度。

#include <stdio.h>

int count_inversions(int arr[], int n) {
    int count = 0;  // 记录逆序对的个数

    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (arr[i] > arr[j]) {
                count++;
                printf("<%d,%d>\n",arr[i],arr[j]);
            }
        }
    }

    return count;
}

int main() {
    int n;  // 数组的长度
    printf("请输入数组的长度: ");
    scanf("%d", &n);

    int arr[n];  // 动态分配数组的内存空间

    printf("请输入数组的元素: ");
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    int inversions = count_inversions(arr, n);
    printf("逆序对的个数为: %d\n", inversions);

    return 0;
}

 

二、鸡兔同笼

有一群鸡和一群兔,它们的只数相同,它们的脚数都是三位数,且这两个三位数 的各位数字只能是 0、1、2、3、4、5。设计一个算法用蛮力法求鸡和兔的只数各是多 少?它们的脚数各是多少?

 代码实现:

#include <stdio.h>

void solve() {
    int a, b, c, d, e, f;
    int x1, x2, y, z;

    for (a = 1; a <= 5; a++) {
        for (b = 0; b <= 5; b++) {
            for (c = 0; c <= 5; c++) {
                for (d = 1; d <= 5; d++) {
                    for (e = 0; e <= 5; e++) {
                        for (f = 0; f <= 5; f++) {
                            y = a * 100 + b * 10 + c; // 鸡脚数
                            z = d * 100 + e * 10 + f; // 兔脚数
                            x1 = y / 2; // 鸡只数
                            x2 = z / 4; // 兔只数
                            if (y == x1 * 2 && z == x2 * 4 && x1 == x2) {
                                printf("鸡只数: %d, 兔只数: %d, 鸡脚数: %d, 兔脚数: %d\n", x1, x2, y, z);
                            }
                        }
                    }
                }
            }
        }
    }
}

int main() {
    printf("求解结果:\n");
    solve();
    return 0;
}

三、求班级最多人数

        设该年级的人数为 x ,租船数为 y 。因为每只船坐 10 人正好多出 2 个座位,则
x =10* y - 2 ;因为每只船多坐 2 人即 12 人时可少租 1 只船(没有说恰好全部座位占满),有
x + z =12*( y - 1) z 表示此时空出的座位,显然 z <12 。让 y 1 100 (实际上 y 取更大范围
的结果是相同的)、 z 0 11 枚举,求出最大的 x 即可。
#include<iostream>
using namespace std;
void solve()
{
    int x, y;
    int z;
    for (int y = 1; y <= 100; y++)
    {
        for (z = 0; z <= 11; z++)
        {
            if (10 * y - 2 == 12 * (y - 1) - z)
            {
                x = 10 * y - 2;
            }
        }
    }
    cout << x;
}
int main()
{
    solve();
    return 0;
}

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值