01 Gym - 101078L--数学推导

本文介绍了一种针对特定问题的优化算法,通过调整01字符串中1的位置来达到最小化总移动距离的目标。该算法应用于路径规划问题,通过数学运算减少路径长度,提高效率。

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

传送门  : https://cn.vjudge.net/problem/Gym-101078L

思路:

不难 分析出,所有移动的总步数是一定的,但是因为对每一个分支进行开平方,这样使得总和发生了变化

但是 对于5来说

1+1+1+1+1

1+2+2

1+2+1+1

2+3

5

开平方来说,很明显上述开平方求和,最后一种情况的值最小。

所以,对于整个01字符串来说,最先出现的1 一定要和最后出现的0 交换,这样的话,得到的总和最小

#include <iostream>
#include<cstdio>
#include <cstring>
#include <cmath>1
using namespace std;
char s[55050];
int main ()
{
    scanf("%s",s);
    int n=strlen(s);
    int ans=0;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='1')
        {
            ans++; //数出1的个数
        }
    }
    int j=n-ans; //从j到 n-1 所有位置应该全部为1
    int i=j-1; //从这个点往前找出所有的1
    double sum=0;
    while(i>=0 && j<n)
    {
        while(s[i]=='0') //i 找前面的1,为0的话,自-
        {
            i--;
        }
        while(s[j]=='1') // j 往后找0, 为1的话 自+
        {
            j++;
        }
        if(i>=0 && j<n) // 如果没有这个限制条件的话,当 i<0 或者 j>=n 以后,会多一步多余运算
        {
        sum+=sqrt(j-i); 
        i--;
        j++;
        }
    }
     printf("%.12lf\n",sum);


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值