今天在VIJOS上做04年合并苹果的题
http://www.vijos.cn/Problem_Show.asp?id=1097写了个快速排序+插入排序,递交,10个数据全部超时!
于是进讨论区,一位C++的仁兄也是快速排序+插入排序,把他的递交上去AC!
郁闷啊,怎么办啊!
我的C版
#include <stdio.h>
#include <conio.h>
//合并苹果
//noip2005
long a[10001];
int n;
int n1;
void quicksort(int left,int right)
{
int i=left,j=right;
long temp=a
;
while(i<j)
{
while(temp>a[j]&&j>i) j--;
if(j>i) {a=a[j]; i++;}
while(temp<a&&j>i) i++;
if(j>i) {a[j]=a; j--;}
}
a=temp;
if(left<i-1) quicksort(left,i-1);
if(right>i+1) quicksort(i+1,right);
}
void charu(int n)
{
long temp=a[n];
int i=n-1;
while(a[n]>a&&i>=1)
{a[i+1]=a;
i--;
}
a[i+1]=temp;
}
int main(void)
{
int i,j;
long zong=0;
scanf("%d",&n);
n1=n;
for(i=1;i<=n;i++)
{
scanf("%ld",&a);
}
i=1;
quicksort(1,n);
a[n1-i]=a[n1-i]+a[n1-i+1];
zong+=a[n1-i];
n--;
for(i=2;i<=n1-1;i++)
{
charu(n);
a[n1-i]=a[n1-i]+a[n1-i+1];
zong+=a[n1-i];
n--;
}
printf("%ld",zong);
getch();
return 0;
}
C++的:
#include<iostream>
using namespace std;
int a[10001],b[10001];
int n;
void qsort(int*a,int l,int r)
{int i,j;
int t;
i=l;j=r;t=a;
while(i<j)
{
while(a[j]>t&&j>i)
j--;
if (i<j)
{a=a[j];i++;}
while(a<t &&i<j)
i++;
if (i<j) {a[j]=a;j--;}
}
a=t;i++;j--;
if(l<j) qsort(a,l,j);
if(i<r) qsort(a,i,r);
}
void init()
{ int i,j,s[20001];
cin>>n;
for(i=1;i<=n;i++)
cin>>a;
qsort(a,1,n);
}
void insort()
{for(int i=2;i<=n;i++)
{ a[0]=a;
int j=i-1;
while (a[j]>a[0])
{a[j+1]=a[j];
j--;
}
a[j+1]=a[0];
}
}
void doit()
{long i,all=0;
for(i=1;i<=n-1;i++)
{a[i+1]=a+a[i+1];
all+=a[i+1];a=0;
insort();
}
cout<<all;
}
int main()
{
init();
doit();
return 0;
}