算法趣题-Q10

一、问题描述

二、问题分析

        这个就是循环求和,比较容易暴力求解(Python实现),当然也可以进行一些优化,减少计算次数,如使用数组进行迭代求和(C/C++实现)。

三、代码实现

1.C/C++实现

#include <iostream>
#define MAX_N 36
#define MIN_N 2
#define ARRAY_SIZE 40

using namespace std;

// 37 个数
int erule[] = { 0, 32, 15, 19, 4, 21, 2, 25, 17,
                34, 6, 27, 13, 36, 11, 30, 8, 23,
                10, 5, 24, 16, 33, 1, 20, 14, 31,
                9, 22, 18, 29, 7, 28, 12, 35, 3, 26 };

// 38 个数
int urule[] = { 0, 28, 9, 26, 30, 11, 7, 20, 32,
                17, 5, 22, 34, 15, 3, 24, 36, 13,
                1, 0, 27, 10, 25, 29, 12, 8, 19,
                31, 18, 6, 21, 33, 16, 4, 23, 35, 14, 2 };

void calc(const int rule[], int size, int result[MAX_N])
{
    memset(result, 0, sizeof(result));
    // 矩阵 temp 用于迭代
    int temp[ARRAY_SIZE];
    for (int i = 0; i < size; i++)
    {
        temp[i] = rule[i];
    }
    // 根据步长进行迭代
    for (int step = 1; step < MAX_N; step++)
    {
        int max = 0;
        for (int j = 0; j < size; j++)
        {
            temp[j] += rule[(j + step) % size];
            if (temp[j] > max)
            {
                max = temp[j];
            }
        }
        result[step] = max;
    }
    
    return;
}

int main()
{
    int eresult[MAX_N];
    int uresult[MAX_N];
    calc(erule, 37, eresult);
    calc(urule, 38, uresult);
    int count = 0;
    for (int i = MIN_N - 1; i < MAX_N; i++)
    {
        if (eresult[i] < uresult[i])
        {
            count++;
        }
    }
    cout << count << endl;
    return 0;
}

2.Python实现

# coding=utf-8

e_rule = [0, 32, 15, 19, 4, 21, 2, 25, 17,
          34, 6, 27, 13, 36, 11, 30, 8, 23,
          10, 5, 24, 16, 33, 1, 20, 14, 31,
          9, 22, 18, 29, 7, 28, 12, 35, 3, 26]

u_rule = [0, 28, 9, 26, 30, 11, 7, 20, 32,
          17, 5, 22, 34, 15, 3, 24, 36, 13,
          1, 0, 27, 10, 25, 29, 12, 8, 19,
          31, 18, 6, 21, 33, 16, 4, 23, 35, 14, 2]


def calc(rule, min_n, max_n):
    n_max = []
    len_rule = len(rule)
    for n in range(min_n, max_n + 1):
        max_sum = 0
        for i in range(len_rule):
            if i + n < len_rule:
                temp = sum(rule[i:i + n])
            else:
                temp = sum(rule[i:]) + sum(rule[:(i + n) % len_rule])
            if temp > max_sum:
                max_sum = temp
        n_max.append(max_sum)
    return tuple(n_max)


if __name__ == '__main__':
    e_re = calc(e_rule, 2, 36)
    u_re = calc(u_rule, 2, 36)
    count = 0
    for i in range(36 - 2 + 1):
        if e_re[i] < u_re[i]:
            count += 1
    print(count)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值