今天巩固了下二叉数知识也重新理解了下广度搜索的代码用法。然后还做了补题。
此题目就是典型的考二叉树前中后序学的咋样,在已近知道前序和中序的情况下因为后序的根节点在最后面可以知道最后输出根节点,然后递归划分把中序的根节点找到再分为左子树与右子数然后在左子数里有又分。到最后只剩下一个子树的子树.....的根节点了。这样就能求出后序记住先左后右。代码如下。
#include <stdio.h>
#include <string.h>
char a[26], b[26];
void fun(int al, int ar, int bl, int br)
{
int cnt;
for (int i = bl; i <= br; i++)
{
if (b[i] == a[al]) {
cnt = i;
break;
}
}
int ln = cnt - bl;
int rn = br - cnt;
if (ln > 0)
{
fun(al + 1, al + ln, bl, bl + ln - 1);
}
if (rn > 0)
{
fun(ar - rn + 1, ar, cnt + 1, cnt + rn);
}
printf("%c", a[al]);
return;
}
int main()
{
scanf("%s", b);
getchar();
scanf("%s", a);
int l = strlen(a);
fun(0, l - 1, 0, l - 1);
return 0;
}
2.昨天的那道f补题因为没有整合所以当时出现了错误。正确的代码如下。
#include<stdio.h>
int a[200020] = {0},b[200020] = {0},c[200020] = {0};
void qsort(int l,int r)
{
if(l>=r)
return ;
int mid=(l+r)/2;
qsort(l,mid);
qsort(mid+1,r);
int cnt=0;
int i=l,j=mid+1;
while (i<=mid&&j<=r)
{
if(a[i]<=a[j])
{
b[cnt++]=a[i++];
}
else
{
b[cnt++]=a[j++];
}
}
while(i<=mid)
{
b[cnt++]=a[i++];
}
while(j<=r)
{
b[cnt++]=a[j++];
}
for(i=l,j=0;i<=r;i++,j++)
{
a[i]=b[j];
}
}
int main()
{
int t;
int n,k,x,i,max,p,q;
scanf("%d",&t);
while (t--)
{
max=-1e9;
scanf("%d %d %d",&n,&k,&x);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
qsort(1,n);
for(int i=1;i<=n;i++)
{
c[i]=c[i-1]+a[i];
}
for (i = 0; i <= k; i++)
{
if (n < i + x)
x = n - i;
p = c[n - i - x];
q = c[n - i] - p;
if (max < p - q)
max = p - q;
}
printf("%d\n", max);
}
}
3.
此题目其实就是找一个数列的最大减去另外一个数列的最小与数列的最小减去另外一个数列的最大的绝对值。中的最大值就行,然后求和。代码如下。
#include<stdio.h>
#include<math.h>
const int N=2e5+100;
int n,m,t;
int a[N],b[N],c[N];
#define ll long long
ll ans;
int main(){
int max(int x,int y);
void qsort(int l,int r,int *q);
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++)scanf("%d",&b[i]);
qsort(1,n,a);
qsort(1,m,b);
for(int i=1;i<=n;i++)
{
ans+=((ll)max(abs(a[i]-b[n-i+1]),abs(a[i]-b[m-i+1])));
}
printf("%lld\n",ans);
ans=0;
}
return 0;
}
void qsort(int l,int r,int *q)
{
if(l>=r)
return ;
int mid=(l+r)/2;
qsort(l,mid,q);
qsort(mid+1,r,q);
int cnt=0;
int i=l,j=mid+1;
while (i<=mid&&j<=r)
{
if(q[i]<=q[j])
{
c[cnt++]=q[i++];
}
else
{
c[cnt++]=q[j++];
}
}
while(i<=mid)
{
c[cnt++]=q[i++];
}
while(j<=r)
{
c[cnt++]=q[j++];
}
for(i=l,j=0;i<=r;i++,j++)
{
q[i]=c[j];
}
}
int max(int x,int y)
{
if(x<=y)
return y;
else
return x;
}
然后今天还学习了线性表。希望明天能突然开窍。