AOJ1325 Bit String Recordering

Bit String Reordering | Aizu Online Judge

Introduction to Programming Introduction to Algorithms and Data Structures Library of Data Structures Library of Graph Algorithms Library of Computational Geometry Library of Dynamic Programming Library of Number Theory

連続するビット列の数が与えられる.最初を にする, にするの パターンをシュミレーション(左端から決めていき,違ったら右から持ってくる)して,swap回数の小さい方を出力した.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <map>
#include <set>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1<<30
#define pb push_back
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int main() {
  int n, m;
  cin >> n >> m;

  vector<int> a(n), b(m);
  rep(i, n) cin >> a[i];
  rep(i, m) cin >> b[i];


  vector<int> c, d;
  rep(i, m) {
      rep(j, b[i]) {
          if(i & 1) {
              c.push_back(1);
              d.push_back(0);
          } else {
              c.push_back(0);
              d.push_back(1);
          }
      }
  }

  int ans = INF, res = 0;
  vector<int> t(a.begin(), a.end());
  rep(i, n) {
      if(t[i] == c[i]) continue;

      REP(j, i+1, n) {
          if(c[i] == t[j]) {
              for(int k = j; k-1 >= i; k--) {
                  swap(t[k], t[k-1]);
                  res++;
              }
              break;
          }
      }
  }

  bool flag = true;
  rep(i, n) {
      if(t[i] == c[i]) continue;
      flag = false;
  }

  if(flag) {
      ans = min(ans, res);
  }

  res = 0;
  rep(i, n) t[i] = a[i];

  rep(i, n) {
      if(t[i] == d[i]) continue;

      REP(j, i+1, n) {
          if(d[i] == t[j]) {
              for(int k = j; k-1 >= i; k--) {
                  swap(t[k], t[k-1]);
                  res++;
              }
              break;
          }

      }
  }

  flag = true;
  rep(i, n) {
      if(t[i] == d[i]) continue;
      flag = false;
  }

  if(flag) {
      ans = min(ans, res);
  }

  cout << ans << endl;

  return 0;
}
Mar 22nd, 2016