Gym100803 Problem A Bit String Reordering

[题目链接](https://vjudge.net/problem/Gym-100803A

题意:
直接看第一个样例,6是第二行的0/1的个数,3是第三行的数字的个数。
第三行可解释为以下两种情况:

  • 1 000 11
  • 0 111 00

第二行的串,求用最少的交换次数(只能相邻交换),变成第三行的某一种串。

做法:
先预处理两种情况,考虑到样例2中的4不能表示为4个连续的1,所以统计1的个数,跳过不符合条件的情况。

然后,对每种可能的情况,从左至右挨个比较,若不相同,原串当前数字,与原串当前位置后的,第一个与目标串当前数字相等的数字交换,统计相邻交换的次数(j - i)。

反省:

  1. 1 3 2说明并不是2^n,而是2种情况
  2. 相邻交换
  3. 直接统计交换次数–>从串后往前看,前一次的交换“不影响”当次的交换次数
#include <stdio.h>
#include <algorithm>
using namespace std;

#define INF 0x3f3f3f3f
int n, m;

int  // 串a中1的个数
f(int a[20]) {
    int i, total = 0;

    for( i = 0; i < n; i++ ) {
        if( a[i] == 1 ) {
            total++;
        }
    }
    return total;
}

int
main() {
    //freopen("in.txt", "r", stdin);

    int i, j, t, ta, tb, tans;
    int s[20], r[20], a[20], b[20], p[20];

    while( scanf("%d %d", &n, &m) != EOF ) {
        for( i = 0; i < n; i++ ) {
            scanf("%d", &s[i]);
            r[i] = s[i];
        }
        for( i = 0; i < m; i++ ) {
            scanf("%d", &p[i]);
        }
        // 预处理
        t = 0;
        for( i = 0; i < m; i++ ) {
            if( i % 2 == 0 ) {
                for( j = 0; j < p[i]; j++ ) {
                    a[t++] = 1;
                }
            }
            else {
                for( j = 0; j < p[i]; j++ ) {
                    a[t++] = 0;
                }
            }
        }
        t = 0;
        for( i = 0; i < m; i++ ) {
            if( i % 2 != 0 ) {
                for( j = 0; j < p[i]; j++ ) {
                    b[t++] = 1;
                }
            }
            else {
                for( j = 0; j < p[i]; j++ ) {
                    b[t++] = 0;
                }
            }
        }

//        for( i = 0; i < n; i++ ) {
//            printf("%d %d %d\n", r[i], a[i], b[i]);
//        }
//        printf("%d %d %d\n", f(a), f(b), f(s));

        ta = tb = 0;
        if( f(a) != f(s) ) {
            ta = INF;
        }
        else {
            for( i = 0; i < n; i++ ) {
                if( s[i] != a[i] ) {
                    for( j = i + 1; j < n; j++ ) {
                        if( s[j] == a[i] ) {
                            swap(s[i], s[j]);
                            ta += (j - i);  // j - i
                            break;
                        }
                    }
                }
            }
        }
//        for( i = 0; i < n; i++ ) {
//            printf("%d %d %d\n", s[i], a[i], b[i]);
//        }
//        printf("\n");
        if( f(b) != f(r) ) {
            tb = INF;
        }
        else {
            for( i = 0; i < n; i++ ) {
                if( r[i] != b[i] ) {
                    for( j = i + 1; j < n; j++ ) {
                        if( r[j] == b[i] ) {
                            swap(r[i], r[j]);
                            tb += (j - i);  // j - i
                            break;
                        }
                    }
                }
            }
        }
//        for( i = 0; i < n; i++ ) {
//            printf("%d %d %d\n", r[i], a[i], b[i]);
//        }
//        printf("%d %d\n", ta, tb);
        tans = min(ta, tb);
        printf("%d\n", tans);
    }

    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自2020年以来,自动驾驶汽车(Autonomous Vehicle)在这一领域取得了显著进展。 自动驾驶汽车通过使用先进的传感技术,如雷达、激光雷达和摄像头,以及深度学习和人工智能算法,实现了车辆的自主驾驶。它们能够感知周围环境,了解道路状况,并做出相应的决策和行驶动作,从而实现无需人类操控的车辆行驶。 自动驾驶汽车在2020年迅速崭露头角。它们的技术日益成熟,不断的实验和测试表明其在安全性和性能方面已经取得了显著的突破。虽然仍然存在一些挑战,比如在复杂城市环境中导航和处理紧急情况,但这些问题正经过不断的研究和改进来得以解决。 在未来,自动驾驶汽车有望在各个领域发挥重要作用。首先,它们将可以提高道路交通的安全性。由于自动驾驶车辆不受人类司机的疲劳、分心和驾驶误差的限制,它们的驾驶能力更为稳定和准确。其次,自动驾驶汽车还能够提高交通效率。通过与其他车辆实时通信和协同,它们可以避免交通堵塞和减少事故发生,从而减少交通拥堵和行车时间成本。 此外,自动驾驶汽车也将为交通出行带来便利和舒适性。乘客可以更轻松地进行其他活动,如工作、休息或娱乐,而不必担心驾驶问题。老年人和残障人士也将能够自由独立地出行,提高他们的生活质量。 综上所述,作为2020年的重要趋势,自动驾驶汽车具有广阔的应用前景。通过不断的创新和发展,它们将在道路交通安全、交通效率和出行体验方面取得进一步的提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值