11. 排兵布阵 编程练习

本程序通过C语言实现,主要功能是读取一组数据,计算并输出数据在x轴和y轴上的中位数,进而计算并输出所有数据点到中位数点的总距离。程序首先初始化数据数组,然后读取用户输入的数据,接着对数据进行排序以找到中位数,最后计算并输出总步骤数,即所有数据点到中位数点的距离之和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stdio.h"
#include "stdlib.h"
#include "math.h"

long x[100005], y[100005];
long x1[100005];
int comp(const void*a, const void*b)
{
     return *(int *)a - *(int *)b;
}
int main()
{
    long n = 0;
    scanf("%ld",&n);
    long kx, ky;
    long long steps = 0;

    for (long i = 0; i < n; i++)
    {
        x[i] = 0;
        y[i] = 0;
        x1[i] = 0;
    }
    for (long i = 0; i < n; i++)
    {
        scanf("%ld %ld", &x[i], &y[i]);
    }
    qsort(x, n, sizeof(long), comp);
    qsort(y, n, sizeof(long), comp);
    ky = y[n / 2];//ky即为y轴数据中位数

    for (long i = 0; i < n; i++)
    {
        x1[i] = x[i] - i;
    }
    qsort(x1, n, sizeof(long long),comp);
    kx = x1[n / 2];

    for (long i = 0; i < n; i++)
    {
        steps = steps + abs(y[i] - ky);
        steps = steps + abs(x[i] - i - kx);
    }    
    printf("%lld\n", steps);

    return 0;
}

 

### C++ 动态规划实现布阵算法 动态规划是一种通过将复杂问题分解为更简单的子问题来解决问题的技术[^3]。对于“布阵”这类问题,通常可以将其建模为一个资源分配问题,在给定约束条件下最大化某种目标函数。 以下是基于动态规划的一个典型布阵问题的解决方案: #### 问题描述 假设我们有 `n` 名士和 `m` 种不同的战斗位置。每名士可以在某些特定的位置上发挥战斗力,而我们的目标是找到一种安方式使得总战斗力最大。 #### 输入数据结构 - 士编号:从 1 到 n。 - 战斗位置编号:从 1 到 m。 - 每个士在不同位置上的战斗力矩阵 `power[n][m]`,其中 `power[i][j]` 表示第 i 名士在第 j 个位置上的战斗力。 #### 解决方案 我们可以定义状态转移方程如下: 设 `dp[mask]` 表示当前已经选择了哪些士(用二进制掩码表示),以及在这种情况下能够获得的最大战斗力,则状态转移方程为: \[ dp[mask | (1 << k)] = \max(dp[mask | (1 << k)], dp[mask] + power[k][pos]) \] 这里 \( pos \) 是当前考虑的战斗位置,\( mask \) 是已选士集合的二进制表示形式。 下面是完整的代码实现: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; const int MAX_N = 20; // 最大士数量 int power[MAX_N][MAX_N]; // 战力表 int dp[1 << MAX_N]; // DP数组 // 初始化DP并计算结果 int maxCombatPower(int n, int m) { fill(dp, dp + (1 << n), -1e9); dp[0] = 0; for (int mask = 0; mask < (1 << n); ++mask) { if (dp[mask] == -1e9) continue; // 如果该状态不可达则跳过 int nextPos = __builtin_popcount(mask); // 下一个要放置的位置索引 if (nextPos >= m) break; // 超过可用位置数停止 for (int i = 0; i < n; ++i) { if (!(mask & (1 << i))) { // 如果士未被使用 dp[mask | (1 << i)] = max( dp[mask | (1 << i)], dp[mask] + power[i][nextPos] ); } } } // 找到最后的结果 int result = -1e9; for (int mask = 0; mask < (1 << n); ++mask) { if (__builtin_popcount(mask) <= m && dp[mask] > result) { result = dp[mask]; } } return result; } int main() { int n, m; cin >> n >> m; // 输入士数和位置数 // 输入战力表 for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> power[i][j]; } } cout << "Maximum Combat Power: " << maxCombatPower(n, m) << endl; } ``` 上述代码实现了如何利用动态规划方法解决布阵问题,并且包含了输入处理部分以便于测试各种场景的数据集[^4]。 #### 关键点解释 - **状态压缩**:由于士数目较少(最多支持约20人),可以用整型变量中的每一位来标记某个士是否已经被部署。 - **时间复杂度**:O(2^n * m),适合较小规模的问题实例。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值