首页 > 试题广场 >

调整队形

[编程题]调整队形
  • 热度指数:4582 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
在幼儿园有n个小朋友排列为一个队伍,从左到右一个挨着一个编号为(0~n-1)。其中有一些是男生,有一些是女生,男生用'B'表示,女生用'G'表示。小朋友们都很顽皮,当一个男生挨着的是女生的时候就会发生矛盾。作为幼儿园的老师,你需要让男生挨着女生或者女生挨着男生的情况最少。你只能在原队形上进行调整,每次调整只能让相邻的两个小朋友交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:
GGBBG -> GGBGB -> GGGBB
这样就使之前的两处男女相邻变为一处相邻,需要调整队形2次

输入描述:
输入数据包括一个长度为n且只包含G和B的字符串.n不超过50.


输出描述:
输出一个整数,表示最少需要的调整队伍的次数
示例1

输入

GGBBG

输出

2

最终结果就是“GGG....GB...BBB"和"BBB....BG...GGGG"两种,如果是第一种的话,只要判定字符串里面是不是包含"BG"这样的字符,如果包含则用"GB”替换第一个“BG”,次数加一,直到字符串中不包含"BG"。如果是第二种的话,只要判定字符串里面是不是包含"GB”这样的字符,如果包含则用"BG"替换第一个“GB",次数加一,直到字符串中不包含"GB"。输出两种情况次数较小者。


import java.util.Scanner;  public class 调整队形 { public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);  String line = scanner.nextLine();  String temp = line;  int timeGb = 0;  while (true) { if (temp.contains("BG")) {
                temp = temp.replaceFirst("BG", "GB");  timeGb++;  } else { break ;  }
        } int timeBG = 0;  temp = line;  while (true) { if (temp.contains("GB")) {
                temp = temp.replaceFirst("GB", "BG");  timeBG++;  } else { break;  }
        }
        System.out.println(Math.min(timeBG, timeGb));  }
}


编辑于 2018-03-13 14:56:55 回复(0)
//将男生全部移到左边,或者将女生全部移到左边,取两者最小值 import java.util.Scanner;  /**  * Created by meichen on 17-9-7.  */ public class Main { public static void main(String[] args){
        Scanner in = new Scanner(System.in);  while (in.hasNext()){
            String str = in.nextLine();  int gl = 0;  int index = 0;  for(int i = 0;i < str.length(); i++){ if(str.charAt(i) == 'G'){
                    gl += i - index;  index++;  }
            }
            index = 0;  int bl = 0;  for(int i = 0;i < str.length(); i++){ if(str.charAt(i) == 'B'){
                    bl += i - index;  index++;  }
            }
            System.out.println(gl < bl ? gl : bl);  }
    }
}

发表于 2017-09-07 18:34:29 回复(0)
import java.util.*;
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        int maxB=0;
        int maxG=0;
        int j=0;
        int k=0;
        Scanner reader = new Scanner(System.in);
        String stulist = reader.nextLine();
        char[] stus = stulist.toCharArray();
        for(int i=0;i<stus.length;i++){
            if(stus[i]=='B'){
                
                maxB = maxB+i-j;
                j++;
            }else{
                
                maxG = maxG+i-k;
                k++;
            }
        }


        if(maxB<maxG){
            System.out.print(maxB);
        }else{
            System.out.print(maxG);
        }
    }
}

发表于 2017-05-11 20:20:43 回复(0)
import java.util.ArrayList;
import java.util.Scanner;

/**
 * 调整队形最终的结果为要么男生在左,女生在右,要么反过来
 * 只要BBBBGGGGG 或者GGGGGBBBBB即可
 * 然而,对于初始状态,比如GGBBG,该如何调整呢?
 * 既然最终结果只有两种可能,GGGBB 和BBGGG
 * 那么只要比较这两种可能所付出的代价即可,
 * 那么这么想,既然GGGBB和BBGGG都有可能,是不是,调整的时候只动
 * B或者只动G就行了,因为他们无疑是等价的嘛
 *
 * 好,那么我们就只移动B,用一个list记录每个B所在的位置,
 * 比如GGBBG,list中有个值,2和3,大小为2
 *
 * 好,那么现在关键的问题,就是如何比较了
 * 比如,GGBBG怎么调整,代价最小,最终结果是GGGBB还是BBGGG
 *

 */
public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        sc.close();
        int n = s.length();
        if (n <= 0 || n > 50) {
            throw new RuntimeException("the length is too long");
        }
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i ++) {
            if (s.charAt(i) == 'B') {
                list.add(i);
            }
        }
        int bSize = list.size();
        int indexSum = 0;
        for (int val : list) {
            indexSum += val;
        }
        int left = indexSum - bSize * (bSize - 1) / 2;
        int right = bSize * (n - 1) - indexSum - bSize * (bSize - 1) / 2;
        System.out.println(Math.min(left, right));
    }
}

发表于 2017-04-09 10:28:50 回复(0)