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