您的位置:首页 > 其它

两数组最短距离 acm

2010-04-18 13:46 225 查看

两数组最短距离

Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByte
Total Submit: 86 Accepted: 41

[b]Description


已知元素从小到大排列的两个数组x[]和y[],请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个,这叫做数组的距离。

Input

第一行为两个整数m, n(1≤m, n≤1000),分别代表数组f[], g[]的长度。
第二行有m个元素,为数组f[]。
第三行有n个元素,为数组g[]。

Output

数组的最短距离

Sample Input

5 5
1 2 3 4 5
6 7 8 9 10


Sample Output

1


Hint

你能想出O(n+m)的算法吗?^_^

我的答案:
int miniDistance(int* a,int* b,int aLen,int bLen)
{
int aPos,int bPos;
int miniDistance;
int aPointer=0;
int bPointer=0;
int dist=pow(2,sizeof(int)-1)-1;//big enough
//at any time ,increase pointer of the small number side,
//because increase pointer of big number side only can increase the distance
//which is not helpful to our goal
while(aPointer<aLen&&bPointer<bLen){
int tmp=0;
if(*(a+aPointer)<*(b+bPointer)){
tmp=*(b+bPointer)-*(a+aPointer);
if(tmp<dist){
dist=tmp;
aPos=aPointer;
bPos=bPointer;
}
aPointer++;
}else if(*(a+aPointer)>*(b+bPointer)){
tmp=*(a+aPointer)-*(b+bPointer);
if(tmp<dist){
dist=tmp;
aPos=aPointer;
bPos=bPointer;
}
bPointer++;
}else{//equal
aPos=aPointer;
bPos=bPointer;
miniDistance=0;
return;
}
}
//shortest distance found for the moment
miniDistance=dist;

//situation(aPointer==aLen&&bPointer==bLen)&&
//situation(aPointer<aLen&&bPointer<bLen) do not exist
if(aPointer==aLen){
while(*(a+aPointer-1)>*(b+bPointer)&&bPointer<bLen){
bPointer++;
}
if(bPointer==bLen){
bPos=bPointer;
miniDistance=*(a+aPointer-1)-*(b+bPointer);
}else{
int latter=*(b+bPointer)-*(a+aPointer-1);
int former=*(a+aPointer-1)-*(b+bPointer-1);
if(latter<former&&latter<dist){
bPos=bPointer;
miniDistance=latter;
}else if(former<dist){
bPos=bPointer-1;
miniDistance=former;
}
}
}else{//bPointer==bLen
while(*(a+aPointer)<*(b+bPointer-1)&&aPointer<aLen){
aPointer++;
}
if(aPointer==aLen){
aPos=aPointer;
miniDistance=*(b+bPointer)-*(a+aPointer-1);
}else{
int latter=*(a+aPointer)-*(b+bPointer-1);
int former=*(b+bPointer-1)-*(a+aPointer-1);
if(latter<former&&latter<dist){
aPos=aPointer;
miniDistance=latter;
}else if(former<dist){
aPos=aPointer-1;
miniDistance=former;
}
}
}
return miniDistance;
}


[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: