1月17日学习总结

1、早上

继续在做昨天测试遗留下来的两个题目,但只做出了一个。(3h)

1月17日学习总结

 解题思路:本题用常规方法会超时,所以需要找规律。找到青蛙落到每块板子上后需要跳((k-1)*m+l)/d*d+d即可跳出该木板,青蛙跳就只有两种情况一种是跳到板子上就继续跳,另一种就是没跳到板子上落下即停止循环。

#include <stdio.h>
main()
{long long n,d,m,l,t=0;
 scanf("%lld%lld%lld%lld",&n,&d,&m,&l);
 for(long long k=1;k<=n;k++)
  { if(t<(k-1)*m) //不能跳到平台上就结束 
     break;
    if(t<=(k-1)*m+l) //能跳到平台上就一直跳直至跳出该平台 
     t=((k-1)*m+l)/d*d+d; //正常while加t+=d不行 ,会超时 
  }
 printf("%lld",t);     
}

2、下午

继续做测试遗留下来的最后一个题目,做了两个小时左右还没有做出来。之后就开始先做本周的题目,做了自己稍微了解一点的快排,还学到了快排的优化。做完这个就开始看昨天啊哈算法没看完的后面的二叉树、完全二叉树、堆还有并查集等内容。(4.5h)

1月17日学习总结

快排题解:传统快排对于已经排好序或几乎排好序的例子的这种极端例子,时间复杂度将会退化到O(N^2),所以本题最后我用的新学的二分法优化做的。我们需要就基准值选为序列的中心点,从左右两边开始循环找到左边大于基准值与右边小于基准值就交换,直到基准值左边都小于基准值右边都大于基准值,这样一轮排序就已经做好,然后接着分治再将左右两边按此方法一直细分直到整个数列有序。

#include <stdio.h>
int n,a[1000010];
void swap(int *p,int *q)
{ int t=*p;
  *p=*q;
  *q=t;
  return;
}
void quicksort(int left,int right)
{ int mid=a[(left+right)/2],l=left,r=right;
  if(left>=right)
   return;
  do
  {while(a[l]<mid)
    l++;
   while(a[r]>mid)
    r--;
   if(l<=r)
    {swap(&a[l],&a[r]);
     l++;
     r--;
	}
  }while(l<=r);
  quicksort(left,r);
  quicksort(l,right);   
}
main()
{scanf("%d",&n);
 for(int i=0;i<n;i++)
  scanf("%d",&a[i]);
 quicksort(0,n-1);
 for(int i=0;i<n-1;i++)
  printf("%d ",a[i]);
 printf("%d\n",a[n-1]);  
 } 

 3、晚上

看B站博主“正月点灯笼”和其他博主视频学习如何创建二叉树和如何输出二叉树的前、中、后序,并尝试做本周二叉树的题目,但没有做出。(1.5h)

今日总共学习9.5h。

上一篇:1月17日学习总结


下一篇:C语言---1---2022.1.17