CF 279E Beautiful Decomposition

本文提供了一种解决 CodeForces 279E 题目的高效算法,通过分析二进制数特性,提出了一种利用2的幂次表示任意二进制数的方法,并给出了具体的实现思路及代码。

题目链接:http://codeforces.com/problemset/problem/279/E


题目大意:

给定一个长度不超过10^6的二进制数n,求至少要用几个(+ 或 -)2^k(k为整数)加起来才等于n.


题目思路

太久没做题了,理思路理了好久...

(1)可以知道一串连续的1最多只要2个数即可表示(2^x + (-2^0)),当然咯,单个1只要1个数即可.

(2)设串的长度为n,借鉴表示连续1的方法,那么需要个数为该串止于最后一个1中0的个数+2,

例如: 1110101011010000

10000000000000000

- 1110101011010000

= 1010100110000

由于最后一个1借位,使得2^x,与其对应的位起之前的全为1(除了最高位).

(3)设串110..01..1,(..表示不确定个数),我们要判断是否对整个串进行(2)的方法得到n能否更优,只要判断

0..0中0的个数和1..1的个数即可,很显然0的个数肯定不可以大于1的个数,且由(1)可得0的个数不能大于2,

因为不论几个1连续,最多只要2个数即可表示.


代码:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

//#define ll __int64
#define ls rt<<1
#define rs ls|1
#define lson l,mid,ls
#define rson mid+1,r,rs
#define middle (l+r)>>1
#define eps (1e-8)
#define clr_all(x,c) memset(x,c,sizeof(x))
#define clr(x,c,n) memset(x,c,sizeof(x[0])*(n+1))
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define PI (acos(-1.0))
#define _mod(x,y) ((x)>0? (x)%(y):((x)%(y)+(y))%(y))
#define _abs(x) ((x)<0? (-(x)):(x))
#define getmin(x,y) (x= ((x)<0 || (y)<(x))? (y):(x))
#define getmax(x,y) (x= ((y)>(x))? (y):(x))
template <class T> void _swap(T &x,T &y){T t=x;x=y;y=t;}
template <class T> T _max(T x,T y){return x>y? x:y;}
template <class T> T _min(T x,T y){return x<y? x:y;}
int TS,cas=1;
const int M=1000000+5;
char str[M];

void run(){
	int i,j;
	int ret=0,len=strlen(str);
	for(i=0;i<len;i++){
		if(str[i]=='1'){
			int cnt=0;
			for(;str[i]=='1';i++) cnt++;
			if(cnt==1) ret++;
			else{
				ret+=2;
				while(1){
					cnt=0;
					for(;str[i]=='0';i++) cnt++;
					if(i>=len) break;
					if(cnt==1){
						for(;str[i]=='1';i++);
							ret++;
					}
					else if(cnt==2){
						cnt=0;
						for(;str[i]=='1';i++) cnt++;
						if(cnt==1){ret++;break;}
						else ret+=2;
					}else{i--;break;}
				}
			}
		}
	}
	printf("%d\n",ret);
}


void preSof(){
}

int main(){
    //freopen("inputxt","r",stdin);
    //freopen("outputxt","w",stdout);
    preSof();
    //run();
    while(~scanf("%s",str)) run();
    //for(scanf("%d",&TS);cas<=TS;cas++) run();
    return 0;
}


基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方法与Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真与验证,展示了该方法在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想与工程应用技巧。
基于粒子群算法优化Kmeans聚类的居民用电行为分析研究(Matlb代码实现)内容概要:本文围绕基于粒子群算法(PSO)优化Kmeans聚类的居民用电行为分析展开研究,提出了一种结合智能优化算法与传统聚类方法的技术路径。通过使用粒子群算法优化Kmeans聚类的初始聚类中心,有效克服了传统Kmeans算法易陷入局部最优、对初始值敏感的问题,提升了聚类的稳定性和准确性。研究利用Matlab实现了该算法,并应用于居民用电数据的行为模式识别与分类,有助于精细化电力需求管理、用户画像构建及个性化用电服务设计。文档还提及相关应用场景如负荷预测、电力系统优化等,并提供了配套代码资源。; 适合人群:具备一定Matlab编程基础,从事电力系统、智能优化算法、数据分析等相关领域的研究人员或工程技术人员,尤其适合研究生及科研人员。; 使用场景及目标:①用于居民用电行为的高效聚类分析,挖掘典型用电模式;②提升Kmeans聚类算法的性能,避免局部最优问题;③为电力公司开展需求响应、负荷预测和用户分群管理提供技术支持;④作为智能优化算法与机器学习结合应用的教学与科研案例。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解PSO优化Kmeans的核心机制,关注参数设置对聚类效果的影响,并尝试将其应用于其他相似的数据聚类问题中,以加深理解和拓展应用能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值