| 比赛 | 
    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;
}