PAT (Advanced Level) Practice 1029 Median

今天药忘吃喽~ 2023-07-02 05:25 118阅读 0赞

输入不要用cin,用scanf,不然会超时。真的要吐血了,没想到是这个点……
使用cin输入数据时最后一个测试点超时,使用scanf直接89ms过,题限是200ms
在数据量较大时,用scanf能明显减少时间…
不过大部分题超时可能还是因为处理方法不对

这题也不难,使用归并的思想就能解决,主要还是超时的坑,另外下面还有一份我写的使用二分的代码(之前以为超时是方法不对,所以就写了二分),也不复杂,速度也是没话说的。使用scanf是42ms过最后一个用例,哪怕用cin也能100多ms过。这个速度提升就很大了。

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdio.h>
  4. #define maxn 200001
  5. using namespace std;
  6. int a[maxn],b[maxn],la,lb,t[maxn];
  7. int main()
  8. {
  9. cin>>la;
  10. for(int i=0;i<la;i++){
  11. scanf("%d",&a[i]);
  12. }
  13. cin>>lb;
  14. for(int i=0;i<lb;i++){
  15. scanf("%d",&b[i]);
  16. }
  17. int index=(la+lb+1)/2;
  18. int pa,pb,number;
  19. pa=pb=0;
  20. while(pa<la&&pb<lb&&index!=0){
  21. if(a[pa]>b[pb]){
  22. number=b[pb];
  23. pb++;
  24. }else{
  25. number=a[pa];
  26. pa++;
  27. }
  28. index--;
  29. }
  30. if(index==0){
  31. cout<<number;
  32. }else{
  33. if(pa<la){
  34. cout<<a[pa+index-1];
  35. }else if(pb<lb){
  36. cout<<b[pb+index-1];
  37. }
  38. }
  39. return 0;
  40. }

下面给出我用二分写的代码。

  1. #include <iostream>
  2. #include <algorithm>
  3. #include<stdio.h>
  4. #define maxn 200002
  5. using namespace std;
  6. int a[maxn],b[maxn],la,lb;
  7. bool hasfind=false;
  8. int findMedian(int index,int low,int high,int a[],int b[],int lb){
  9. while(low<=high){
  10. int mid = (low+high)/2;
  11. if(mid>index){
  12. high=mid-1;
  13. }else if(index-mid<=lb&&index-mid+1<=lb){
  14. if(a[mid]>=b[index-mid]&&a[mid]<=b[index-mid+1]){
  15. hasfind=true;
  16. return a[mid];
  17. }else if(a[mid]<=b[index-mid]){
  18. low=mid+1;
  19. }else if(a[mid]>=b[index-mid+1]){
  20. high=mid-1;
  21. }
  22. }else if(index-mid<=lb){
  23. if(a[mid]>=b[index-mid]){
  24. hasfind=true;
  25. return a[mid];
  26. }else{
  27. low=mid+1;
  28. }
  29. }else{
  30. return -1;
  31. }
  32. }
  33. return -1;
  34. }
  35. int main()
  36. {
  37. cin>>la;
  38. for(int i=1;i<=la;i++){
  39. scanf("%d",&a[i]);
  40. }
  41. cin>>lb;
  42. for(int i=1;i<=lb;i++){
  43. scanf("%d",&b[i]);
  44. }
  45. int index=(la+lb+1)/2;
  46. int median= findMedian(index,1,la,a,b,lb);
  47. if(hasfind==true){
  48. cout<<median<<endl;
  49. }else{
  50. median = findMedian(index,1,lb,b,a,la);
  51. cout<<median<<endl;
  52. }
  53. return 0;
  54. }

发表评论

表情:
评论列表 (有 0 条评论,118人围观)

还没有评论,来说两句吧...

相关阅读