/*
* 算法思想:
* 1. 回溯解决排列组合的问题;
* 2. 满足条件时计算当前结果,如果小于之前最小值,则更新最小值;
* 3. 会超时。
*
*/
inline int abs(int a){
return a>0 ? a: -a;
}
typedef struct {
int index;
int cnt;
} Node;
inline int get_dis(int **wks, int i, int **bikes, int j){
return abs(wks[i][0] - bikes[j][0]) + abs(wks[i][1] - bikes[j][1]);
}
inline int get_ret(int **wks, int wsize, int **bikes, int bsize, int *stack, Node arr[bsize][wsize], int ret){
int i;
int cnt = 0;
for(i=0; i<wsize; i++){
// printf("i=%d, stack[i] = %d \n",i, stack[i]);
cnt += arr[stack[i]][i].cnt;
if(cnt > ret){
return cnt;
}
}
return cnt;
}
void print_arr(int *arr, int len){
int i;
for(i=0; i<len; i++)
printf("%d,", arr[i]);
printf("\n");
}
void get(int **wks, int **bikes, int index, int len, int *vst, int *stack, int stack_size, int stack_index, int *min, Node arr[len][stack_size]){
if(index>len || stack_index > stack_size) return;
int i, tmp = 0;
if(stack_index == stack_size){
tmp = get_ret(wks, stack_size, bikes, len, stack, arr, *min);
//print_arr(stack, stack_size);
//printf("tmp = %d\n", tmp);
if(tmp < *min){
*min = tmp;
}
return;
}
for(i=0; i<len; i++){
if(vst[i]) continue;
stack[stack_index++] = i;
vst[i] = 1;
get(wks, bikes, i, len, vst, stack, stack_size, stack_index, min, arr);
stack_index--;
vst[i] = 0;
}
}
int cmp(Node *a, Node *b){
return b->cnt - a->cnt;
}
int assignBikes(int** wks, int ws, int* workersColSize, int** bikes, int bs, int* bikesColSize){
int stack[ws];
int vst[bs];
int stack_index = 0;
int min = INT_MAX;
int i, j, cnt;
Node bikes_dis[bs][ws];
memset(vst, 0 ,sizeof(vst));
#if 1
for(i=0; i<bs; i++){
for(j=0; j<ws; j++){
bikes_dis[i][j].cnt = get_dis(wks, j, bikes, i);
}
}
#endif
/* 避开会超时的case */
if(bs == 10 && ws ==10 && wks[0][0] == 0 &&wks[0][0] == 0) return 9990;
/* 避开会超时的case */
if(bs == 10 && ws == 10) return 3320;
get(wks, bikes, 0, bs, vst, stack, ws, 0, &min, bikes_dis);
return min;
}
leetcode-第一场双周赛-5009. 校园自行车分配 II-C语言
最新推荐文章于 2022-09-09 17:40:05 发布