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小时了,嘿嘿,不过就是速度有点慢,下次加油!