2021-02-04

7:20~7:25 打卡学习

17:00~24:00 学习、刷题

本来我想先做那个并查集的题组,看了半天感觉有些枯燥就没看了,于是转向了其他的题组,今天下手的第一道题要用到回溯,回溯我不会,于是又看了很久,看了那么久发现今天自己一个题都还没有刷,于是转向了其他好些的题。
水题二货来了:

I-放苹果
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
Input
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据M和N,用一行输出相应的K。
Sample Input
1
7 3
Sample Output
8

这个题嘛,我很久之前就写过类似的了,就赘述了,放以前写的思路的链接吧
不是很详细,但也够看了
第二个题也是水题

B-补提交卡
蒜头君给自己定了一个宏伟的目标:连续
100
天每天坚持在计蒜客题库提交一个程序。
100
天过去了,蒜头君查看自己的提交记录发现有
N
天因为贪玩忘记提交了。于是蒜头君软磨硬泡、强忍着花椰菜鄙视的眼神从花椰菜那里要来
M
张 “补提交卡”。每张 “补提交卡” 都可以补回一天的提交,将原本没有提交程序的一天变成有提交程序的一天。蒜头君想知道通过利用这
M
张补提交卡,可以使自己的 “最长连续提交天数” 最多变成多少天。
输入格式
第一行是一个整数
T(1≤T≤10),代表测试数据的组数。
每个测试数据第一行是 2 个整数 N和 M(0≤N,M≤100)。
第二行包含
N 个整数 a1,a2,…aN(1≤a1<a2<…<aN≤100),表示第 a1,a2,…aN 天蒜头君没有提交程序。
输出格式
对于每组数据,输出通过使用补提交卡蒜头君的最长连续提交天数最多变成多少。
Sample Input
3
5 1
34 77 82 83 84
5 2
10 30 55 56 90
5 10
10 30 55 56 90
Sample Output
76
59
100

我的思路是把总天数(100天)比做一条长100米的道路,忘记签到的那几天就是道路上的树,补签多少天就代表可以砍掉多少树,然后我用一个数组来记录被N棵树隔开的N+1段道路,然后就很简单了,详见代码:

#include<stdio.h>

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int a[110],b[110],N,M,x;
        scanf("%d%d",&N,&M);
        for(int i=0;i<N;i++)
        {
            scanf("%d",&b[i]);
            if(i==0) a[i]=b[i]-1;
            else a[i]=b[i]-b[i-1]-1;
        }
        if(M>=N) printf("100\n");
        else
        {
           a[N]=100-b[N-1];
        int max=0;
        for(int i=0;i<N+1-M;i++)
        {
            int t=0;
            for(int j=i;j<i+M+1;j++)
            t+=a[j];
            max=(max>t)?max:t;
        }
        printf("%d\n",max+M);
        }

    }
}

最后,我还优化了昨天百思不得其解的那道题的代码,我将队列和树封装组合成了一个结构体,并标注了除开思路外需要注意的容易犯错的两点,详请如下:

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct TREE)

struct TREE
{
    char data;
    struct TREE *next,*l,*r;
};
typedef struct TREE A;

A* fun1()
{
    int x,n=0;
    A *head,*p,*q;
    while(scanf("%d",&x))
    {
        if(x==-1)
            break;
        q=(A*)malloc(LEN);
        q->data=x;
        q->next=NULL;
        q->l=NULL;
        q->r=NULL;
        if(n==0)
            head=p=q;
        else
        {
            p->next=q;
            p=p->next;
        }
        n++;
    }
    /*p=head;
    while(p!=NULL)
    {
        printf("%d\n",p->data);
        p=p->next;
    }*/
    if(head->data==0) return NULL;
    p=q=head;
    q=q->next;
    while(q!=NULL)//注意这里不能用p!=NULL作为判定条件,因为q先出完,此时p也不为空指针
    {
        if(p->l==NULL&&p->data!=0)
        {
            p->l=q;
            q=q->next;
            //printf("L is NULL\n");
        }
        if(q==NULL) break;//之前判题机给我判断运行错误50%,我加了这个条件后就能过了,因为要时时注意q是否为空指针,否则会越界
        if(p->r==NULL&&p->data!=0)
        {
            p->r=q;
            q=q->next;
            //printf("R is NULL\n");
        }
        //printf("p->data=%d\n",p->data);
        p=p->next;
        //printf("%d\n",n--);
    }
    return head;
}
void fun2(A * p)
{
    if((p!=NULL&&p->data!=0)&&p->data!=-1)
    {
        fun2(p->l);
        fun2(p->r);
        printf("%d ",p->data);
        free(p);
    }
}
int fun3(A *p)
{
    if((p==NULL||p->data==0)||p->data==-1) return 0;
    int a=fun3(p->l),b=fun3(p->r),max;
    max=(a>b)?a:b;
    return max+1;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        A* p,*q;
        p=fun1(),q=p;
        printf("%d ",fun3(p));
        fun2(q);
        printf("\n");
    }
}

总计学习7小时,这次可以拍着胸脯说我结结实实在C语言上花了7小时了,嘿嘿,不过就是速度有点慢,下次加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值