记录编号 319487 评测结果 AWWWWWWWWW
题目名称 993.[NOIP 2010冲刺三]宁采臣的书架 最终得分 10
用户昵称 KZNS 是否通过 未通过
代码语言 C++ 运行时间 1.265 s
提交时间 2016-10-10 18:23:49 内存使用 2.08 MiB
显示代码纯文本
//KZNS
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define Nmax 102
#define INF 1061109567
int N, K;
int ls[Nmax] = {0};
int v[Nmax] = {0};
int nb = 0;
int S;
int H;
void init() {
    memset(v, 0, sizeof(v));
    H = 0;
    for (int i = 0; i < N; i++) {
        scanf("%d", ls+i);
        ls[i] -= 25;
        S |= 1<<ls[i];
        v[i] = 1;
        H = max(H, ls[i]);
    }
    nb = N;
    H++;
}
int OOO[256] = {0};
int F[2][Nmax][256][9];
void work() {
    memset(F, 63, sizeof(F));
    int c = 1, p = 0;
	F[p][0][(1<<ls[1])][ls[0]] = 1;
	if (v[0] <= K)
	   F[p][v[0]][0][H] = 0;
	for (int i = 0; i < N-1; i++) {
		memset(F[c], 63, sizeof(F[c]));
		for (int j = 0; j <= K; j++) {
            for (int s = 0; s < S; s++) {
                for (int l = 0; l <= H; l++) {
			        if (F[p][j][s][l] == INF)
                        continue;
			        F[c][j][s|(1<<ls[i+1])][ls[i+1]] = min(
                        F[c][j][s|(1<<ls[i+1])][ls[i+1]],
                        F[p][j][s][l] + (ls[i+1]==l?0:1)
                    );
			        F[c][j+1][s][l] = min(
                        F[c][j][s][l],
                        F[p][j][s][l]
                    );
			    }
		    }
	    }
        p = c;
        c ^= 1;
	}
    int ans = INF;
	for (int j = 0; j <= K; j++) {
        for (int s = 0; s <= S; s++) {
            for (int l = 0; l < H; l++) {
		        if (F[c][j][s][l] == INF)
                    continue;
		        int t = S^s;
	            ans = min(ans, F[c][j][s][l]+OOO[t]);
	        }
	    }
	}
    printf("%d\n", ans);
}
int main() {
    freopen("arrangement.in", "r", stdin);
    freopen("arrangement.out", "w", stdout);
    int u;
    for (int i = 0; i < 256; i++) {
        u = i;
        while (u) {
            OOO[i]++;
            u ^= (u&-u);
        }
    }
    scanf("%d %d", &N, &K);
    int T = 1; 
    while (N || K) {
        init();
        printf("Case %d: ", T++);
        work();
        printf("\n");
        scanf("%d %d", &N, &K);
    }
    return 0;
}
//UBWH