比赛 20120706 评测结果 WWWWWWWTTA
题目名称 排队 最终得分 10
用户昵称 王者自由 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-07-06 10:03:17
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int N = 1000 + 10;
int n, k, h[N], w[N][N];
int l[N], s;
void Swap(int a, int b) {
    if(a == 0 || b == 0) return;
    for(int i=a-1; i>0; i++)
        if(h[i] - h[b] >= k) return;
    for(int i=b-1; i>0; i++)
        if(h[i] - h[a] >= k) return;
    swap(h[a], h[b]);
    swap(l[a], l[b]);
}
int Calc() {
    int e = 0;
    for(int i=1; i<n; i++)
        e += w[l[i]][l[i-1]];
    return e;
}
int main() {
    freopen("queuea.in", "r", stdin);
    freopen("queuea.out", "w", stdout);
    scanf("%d %d", &n, &k);
    for(int i=0; i<n; i++) {
        scanf("%d", h+i);
        l[i] = i;
    }
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            scanf("%d", w[i]+j);
    s = Calc();
    int t;
    srand((int) &t);
    for(int t=0; t<=400000; t++) {
        for(int i=0; i*i<n; i++)
            Swap(rand()%n, rand()%n);
        s = min(s, Calc());
    }
    printf("%d\n", s);
    return 0;
}