RT
为什么这道题(P1626象棋比赛)我用归并排序TLE一个点(测试点2)但是用sort却AC了?
归并排序:
#include<bits/stdc++.h>
using namespace std;
int n,k,a[100010],b[100010],ans;
void msort(int *a,int *b,int l,int r){
if(l==r)return;
int mid=(l+r)/2,t1=l,t2=mid+1;
msort(a,b,l,mid);
msort(a,b,mid+1,r);
for(int i=l;i<=r;++i){
if(t1>mid)b[i]=a[t2++];
else if(t2>r)b[i]=a[t1++];
else if(a[t1]>a[t2])b[i]=a[t2++];
else b[i]=a[t1++];
}
for(int i=1;i<=r;++i)a[i]=b[i];
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
}
msort(a,b,1,n);
memset(b,0,sizeof b);
for(int i=1;i<n;++i){
b[i]=a[i+1]-a[i];
}
memset(a,0,sizeof a);
msort(b,a,1,n-1);
for(int i=1;i<=k;++i){
ans+=b[i];
}
printf("%d",ans);
return 0;
}
Sort:
#include<bits/stdc++.h>
using namespace std;
int n,k,a[100010],b[100010],ans;
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
for(int i=1;i<n;++i){
b[i]=a[i+1]-a[i];
}
sort(b+1,b+n);
for(int i=1;i<=k;++i){
ans+=b[i];
}
printf("%d",ans);
return 0;
}
这么说,我们是不是只需要会用sort就OK了?