http://codeforces.com/problemset/problem/1009/B
解题思路:
1.贪心令0尽量左移,2尽量右移。由于2不能越过其右边的0,所以我以2,0作为分界分组。前面这个思想会WA4,HACK数据:2021。前面思路答案是:2012,但真正答案是1202。这个时候就想到加一个补丁:令所有分组的1都汇集到第一组的1的位置
2.我用三个 Vector 存储分组,tag = true 表示已经遇到了2,再遇到0就把前面统计好的数据塞进Vector
3.别忘了加最后一组
4.先输出第一组0,然后输出所有组的1,再输出第一组2。最后按组输出0和2
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
boolean tag = false;
int a0 = 0,a1 = 0,a2 = 0;
Vector<Integer> v0 = new Vector<>();
Vector<Integer> v1 = new Vector<>();
Vector<Integer> v2 = new Vector<>();
for(int i = 0;i < str.length();i++) {
if(str.charAt(i) == '0' && tag == true) {
v0.add(a0);
v1.add(a1);
v2.add(a2);
a0 = a1 = a2 = 0;
tag = false;
}
if(str.charAt(i) == '0') a0++;
else if(str.charAt(i) == '1') a1++;
else if(str.charAt(i) == '2') {
a2++;
tag = true;
}
}
v0.add(a0);
v1.add(a1);
v2.add(a2);
for(int i = 0;i < v0.get(0);i++)
System.out.print(0);
for(int i = 0;i < v1.size();i++) {
for(int j = 0;j < v1.get(i);j++) {
System.out.print(1);
}
}
for(int i = 0;i < v2.get(0);i++)
System.out.print(2);
for(int i = 1;i < v0.size();i++) {
for(int j = 0;j < v0.get(i);j++)
System.out.print(0);
for(int j = 0;j < v2.get(i);j++)
System.out.print(2);
}
}
}