1029 Median (25分)

这题...直接用sort函数排个序就好了啊...其他博客说什么会爆内存,没有吧。我这代码不管内存还是用时表现都挺好的...注意点有两个,第一序列的个数分为奇数和偶数,两种情况下的中位数位置要注意。第二,序列数据类型用long long。
ps:这题原来的内存限制是1.5MB,那我的代码的确是会超过这个限制。不过现在这题限制是64MB,所以很容易就过了。用柳神的代码跑了一下,虽然内存比我小了一半,但第8个测试点还是超过1.5MB啊...也用其他人的代码跑了,不用sort()函数的代码的内存其实也没好到哪里去...最后附上内存表现最好的代码,有空学习一下。
1 #include <iostream> 2 #include<cstdio> 3 #include<vector> 4 #include<algorithm> 5 using namespace std; 6 int main() 7 { 8 int n; 9 long long num; 10 int sum=0; 11 vector<long long> A; 12 for(int i=0;i<2;i++){ 13 scanf("%d",&n); 14 sum+=n; 15 for(int j=0;j<n;j++){ 16 scanf("%lld",&num); 17 A.push_back(num); 18 } 19 } 20 sort(A.begin(),A.end()); 21 if(sum%2==0) 22 cout<<A[sum/2-1]; 23 else 24 cout<<A[sum/2]; 25 return 0; 26 }
别人写的,所有测试点均未超过1.5MB:
1 #include<stdio.h> 2 3 int l1[200000]; 4 5 int main() 6 { 7 int n1, n2; 8 scanf("%d", &n1); 9 for (int i = 0; i < n1; i++) 10 { 11 scanf("%d", &l1[i]); 12 } 13 scanf("%d", &n2); 14 int median = (float)(n1 + n2) / 2.0 + 0.5; 15 int ans; 16 int i = 0, j = 0; 17 int l2; 18 scanf("%d", &l2); 19 for (int k = 0; k < median; k++) 20 { 21 if (i == n1) 22 { 23 ans = l2; 24 for (; j <= median - n1 - 2; j++) 25 { 26 scanf("%d", &ans); 27 } 28 break; 29 } 30 if (j == n2) 31 { 32 ans = l1[i + median - n2 - 1]; 33 break; 34 } 35 if (l1[i] <= l2) 36 { 37 i++; 38 if (k == median - 1) 39 { 40 ans = l1[i - 1]; 41 break; 42 } 43 } 44 else 45 { 46 j++; 47 if (k == median - 1) 48 { 49 ans = l2; 50 break; 51 } 52 if (j < n2) 53 { 54 scanf("%d", &l2); 55 } 56 } 57 } 58 printf("%d\n", ans); 59 return 0; 60 }

浙公网安备 33010602011771号