1月30日

今天巩固了下二叉数知识也重新理解了下广度搜索的代码用法。然后还做了补题。

此题目就是典型的考二叉树前中后序学的咋样,在已近知道前序和中序的情况下因为后序的根节点在最后面可以知道最后输出根节点,然后递归划分把中序的根节点找到再分为左子树与右子数然后在左子数里有又分。到最后只剩下一个子树的子树.....的根节点了。这样就能求出后序记住先左后右。代码如下。

#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;
}

然后今天还学习了线性表。希望明天能突然开窍。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值