| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
用汇编写的程序,居然都才61MS。。。从快速排序到二分查找,全是用汇编写的,居然都用了61MS,不知道前面的大牛是怎么过的。。。。。
注意,请用C++编译。
#include <stdio.h>
//By 阿长
int a[100010];
int min,max,dest,n,c,best;
void qsort(int head,int tail){
_asm{
mov eax,head
mov edx,tail
cmp eax,edx
JGE over
push ebx
mov ecx,eax
add eax,edx
shr eax,1
shl eax,2
shl ecx,2
mov edx,a[eax]
mov ebx,a[ecx]
mov a[ecx],edx
mov a[eax],ebx
mov edx,tail
shl edx,2
mov eax,ecx
start:
cmp eax,edx
JGE end
mov ebx,a[eax]
loop1: //while (i<j && a[i]<=a[j])
cmp eax,edx
JGE end
cmp ebx,a[edx]
JG endloop1
sub edx,4
jmp loop1
endloop1:
mov ecx,a[edx]
mov a[eax],ecx
mov a[edx],ebx
add eax,4
loop2: //while (i<j && a[i]<=a[j])
cmp eax,edx
JGE end
cmp a[eax],ebx
JG endloop2
add eax,4
jmp loop2
endloop2:
mov ecx,a[eax]
mov a[edx],ecx
mov a[eax],ebx
sub edx,4
jmp start
end:
pop ebx
shr eax,2
push eax
dec eax
push eax
push head
call qsort
add esp,8
pop eax
inc eax
push tail
push eax
call qsort
add esp,8
over:
}
}
main(){
scanf("%d%d",&n,&c);
int i;
for (i=1;i<=n;i++)
scanf("%d",a+i);
qsort(1,n);
min=1;
max=(a[n]-a[1])/(c-1);
best=min;
dest=n*4;
c--;
_asm{
push ebx
mov eax,min
mov edx,max
begin:
cmp eax,edx
JG OK
add edx,eax
shr edx,1
xor ecx,ecx
mov eax,8
xor ebx,ebx
loop3:
cmp eax,dest
JG cannot
add ebx,a[eax]
sub ebx,a[eax-4]
add eax,4
cmp ebx,edx
JL loop3
xor ebx,ebx
inc ecx
cmp ecx,c
JGE can
jmp loop3
cannot:
dec edx
mov max,edx
mov eax,min
jmp begin
can:
cmp best,edx
JGE notupdate
mov best,edx
notupdate:
inc edx
mov min,edx
mov eax,edx
mov edx,max
jmp begin
OK:
pop ebx
}
printf("%d\n",best);
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator