1月29补题

先把上一次的补题交了

由题知道只要第二次输入字符数组里面由a就是无限循环得出结果是-1,而且当第二次输入字符串长度也只有1时是输出1。其余直接用2的len1次方得出结果。代码如下

#include<stdio.h>
#include<string.h>
#include <math.h>
int main()
{
    int n;
    char a[51],s[51];
    scanf("%d",&n);
    while (n--)
    {
        getchar();
        scanf("%s",a);
        getchar();
        scanf("%s",s);
        int len1=strlen(a);
        int len2=strlen(s);
        int flag=0;
        for(int i=0;i<len2;i++)
        {
            if(s[i]=='a')
            flag=1;
        }
        if(flag==1&&len2>1)
        printf("-1\n");
        if(flag==0)
        printf("%.0lf\n",pow(2,len1));
        if(flag==1&&len2==1)
        printf("1\n");
    }
    return 0;
}

这个题目根据题意知道它方向不一样的结果也是不一样的,要注意。只要求出首位到第x位的所坠落的伤害总和然后求区间和就行,暴力是行不通的。

#include <stdio.h>
#define MAX_N 100001
long long a[MAX_N], s, t, ans, b[MAX_N], c[MAX_N];
int main() {
    int n, m;
    int i;
    scanf("%d %d", &n, &m);
    for (i = 1; i <= n; ++i) 
    {
        scanf("%lld", &a[i]);
    }
    for (i = 2; i <= n; ++i) 
    {
        if (a[i - 1] > a[i]) 
        {
            b[i] = b[i - 1] + a[i - 1] - a[i];
        } else {
            b[i] = b[i - 1];
        }
    }
    for (i = n - 1; i >= 1; --i) 
    {
        if (a[i + 1] > a[i]) 
        {
            c[i] = c[i + 1] + a[i + 1] - a[i];
        } else 
        {
            c[i] = c[i + 1];
        }
    }
    for (i = 1; i <= m; ++i) 
    {
        scanf("%lld %lld", &s, &t);
        if (s < t) 
        {
            printf("%lld\n", b[t] - b[s]);
        }
        if (s > t) 
        {
            printf("%lld\n", c[t] - c[s]);
        }
    }
    return 0;
}

这个题目第一个人是需要移除最多k个元素,第二个人就是将数变成负数。所以当变成负数时总数其实是要减去两倍的。所以先将给的数进行排序然后用前缀和去做这个题目。(一开始我用的冒泡排序发现时间超了)如下。然后就改成了归并排序。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int tc;
    scanf("%d", &tc);
    while (tc--)
    {  
        int n, k, x;
        scanf("%d %d %d", &n, &k, &x);
        int a[200020] = {0};
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++) 
    {
        for (int j = i + 1; j <= n; j++) 
        {
            if (a[j] > a[i]) 
            {
                int temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
    }
    for (int i = 1; i <= n; i++)
    a[i] += a[i - 1];
    int ans = -1e9;
         for (int i = 0; i <= k; i++) 
        {
            int min_index = (i + x) > n ? n : (i + x);
            int temp = a[n] - 2 * a[min_index] + a[i];
            if (temp > ans)
                ans = temp;
        }
        printf("%d\n", ans);
    }
    return 0;
}
   void merge_sort(int q[], int l, int r)
{
    
    if (l >= r) return;
    int mid = l + r >> 1;
    merge_sort(q, l, mid);
    merge_sort(q, mid + 1, r);
    int k = 0, i = l, j = mid + 1;
    while (i <= mid && j <= r)
    if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
    else tmp[k ++ ] = q[j ++ ];
    while (i <= mid) 
    tmp[k ++ ] = q[i ++ ];
    while (j <= r) 
    tmp[k ++ ] = q[j ++ ];
    for (i = l, j = 0; i <= r; i ++, j ++ ) 
    q[i] = tmp[j];
}

注意归并排序这里我改了下参数要改一下主函数的参数就行。

然后今天我学了二叉树,知道了前中后以及层序遍历。而且知道了要知道具体的一个二叉树结构需要同时知道中序遍历以及其他三种遍历其中一种。然后知道了这些遍历的具体代码(其实也就是改下顺序)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值