3518. 进化序列(evolve)

本文介绍了一种使用位运算处理数组中特定序列计数的问题解决方法。通过对数组元素进行逐位分析,统计每一位上111序列出现的次数,再通过暴力判断累加符合特定条件的子序列数量,最终得到问题的解答。

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


题目:

传送门


分析:

把所有数按位去做,通过位运算得出每位上 1 1 1的个数
然后再疯狂暴力判断是否符合条件,是就累加答案


代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring> 
#include<cstdlib>
#include<algorithm>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<list>
#include<ctime>
#include<iomanip>
#include<string>
#include<bitset>
#include<deque>
#include<set>
#define LL long long
#define ch cheap
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
LL a[100005],ans,v[35];
int main()
{
	freopen("evolve.in","r",stdin);
	freopen("evolve.out","w",stdout);
	LL n=read(),m=read();
	for(LL i=1;i<=n;i++) a[i]=read();
	LL last=1;
	for(LL i=1;i<=n;i++)
	{
		LL z=0;
		for(LL j=0;j<=30;j++)
		  v[j]+=(a[i]>>j)&1,z+=(v[j]!=0)<<j;
		while(z>=m&&last<i)
		{
			z=0;
			for(LL j=0;j<=30;j++)
			  v[j]-=(a[last]>>j)&1,z+=(v[j]!=0)<<j;
			last++;
		}
		ans+=i-last;
	}
	cout<<ans;
	return 0;
}
### 进化算法及其应用 #### 遗传算法简介 遗传算法作为一种进化算法,通过模拟自然界的选择、交叉和变异机制来解决复杂优化问题。该方法能够有效探索解空间,并找到接近最优的解决方案[^2]。 #### 基本概念 在遗传算法中,每一个潜在解被表示成一条染色体,而每条染色体则由多个基因构成。这些基因共同决定了个体对于特定环境条件下的适应程度。为了评估各个候选方案的好坏,通常会定义一个适应度函数作为衡量标准[^4]。 #### 编码方式 针对不同类型的变量以及实际应用场景的需求,可以选择多种不同的编码策略来进行表征。常见的有二进制字符串形式、浮点数向量或是字符序列等形式之一或组合使用。 #### Python实现示例 下面给出一段简单的Python代码用于演示如何利用遗传算法寻找给定区间内的最大值: ```python import numpy as np from random import randint, uniform def fitness_function(x): """ 定义目标函数 """ return -(x ** 2) + 10 * x - 5 class GeneticAlgorithm: def __init__(self, pop_size=100, chrom_length=8, cross_rate=.7, mutate_rate=.01, max_gen=50): self.pop_size = pop_size # 种群规模 self.chrom_length = chrom_length # 染色体长度(位串) self.cross_rate = cross_rate # 杂交概率 self.mutate_rate = mutate_rate # 变异概率 self.max_gen = max_gen # 最大迭代次数 # 初始化种群矩阵 (pop_size × chrom_length) self.population = [[randint(0, 1) for _ in range(chrom_length)] for i in range(pop_size)] @staticmethod def bin_to_dec(binary_list): """ 将二进制列表转换为十进制整数 """ decimal_value = int(''.join(str(bit) for bit in binary_list), base=2) return decimal_value / ((2 ** len(binary_list)) - 1) def evaluate(self): """ 计算当前群体内所有成员对应的适应度得分 """ scores = [] for chromosome in self.population: score = fitness_function(self.bin_to_dec(chromosome)) scores.append(score) return scores ... ga_instance = GeneticAlgorithm() for generation in range(ga_instance.max_gen): ga_instance.evolve() # 执行一次完整的演化周期 best_solution = ga_instance.get_best_individual() print(f'Best solution found at Generation {generation}:') print(best_solution['chromosome'], '->', best_solution['fitness']) ``` 此段代码展示了创建一个简单的一维连续域上的单峰函数寻优过程。其中包含了初始化参数设置、种群生成、评价体系构建等内容;并通过循环调用`evolve()`完成多代繁衍直至达到预设终止条件为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值