1、早上
继续在做昨天测试遗留下来的两个题目,但只做出了一个。(3h)
解题思路:本题用常规方法会超时,所以需要找规律。找到青蛙落到每块板子上后需要跳((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)
快排题解:传统快排对于已经排好序或几乎排好序的例子的这种极端例子,时间复杂度将会退化到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。