1. 程式人生 > >Gym100803 Problem A Bit String Reordering

Gym100803 Problem A Bit String Reordering

題意:
直接看第一個樣例,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; }