1.上午三个小时五十分钟
完成了补题的第五题Codeforces World Finals、vj栈队列搜索题组的F题,提前学习了树和二叉树。
Codeforces World Finals
CF30B Codeforces World Finals - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
由数学知识可以知道共6种可能,原来我是想把每种情况列出来,进行判断,但没有办法,不知道少了啥,我交一次改一次还错,就放弃了这个做题方法,改成了大家都常用的定义函数的做题方法,因为题目规定了举办比赛的年份和参赛者的出生日期必须与比赛的截止日期同一个世纪,这就使得判断闰的条件就可以少一点,因为闰年和平年的2月份的天数不同,所以就用两个数组分别存闰年和平年的每个月的天数,首先是年月日要在正常范围内,再者参赛者满18,如果都满足就输出YES,否则NO。
代码实现
#include<stdio.h>
int ad,am,ay,bd,bm,by;
int month1[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年每个月的天数
int month2[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每个月的天数
int fun(int m,int n,int o)
{
if(o%4==0)//闰年
{
if(n>0&&n<=12&&m>0&&m<=month1[n])//没有交换或交换后的月和日没有超出正常范围
{
if((ay-o)>18||(ay-o)==18&&(am-n)>0||(ay-o)==18&&(am-n)==0&&(ad-m)>=0)
return 1;
else//超出正常范围
return 0;
}
else
return 0;
}
else//平年同上
{
if(n>0&&n<=12&&m>0&&m<=month2[n])
{
if((ay-o)>18||(ay-o)==18&&(am-n)>0||(ay-o)==18&&(am-n)==0&&(ad-m)>=0)
return 1;
else
return 0;
}
else
return 0;
}
}
int main()
{
scanf("%d.%d.%d",&ad,&am,&ay);
scanf("%d.%d.%d",&bd,&bm,&by);
if(fun(bd,bm,by)||fun(by,bm,bd)||fun(bd,by,bm)||fun(by,bd,bm)||fun(bm,bd,by)||fun(bm,by,bd))//共6种可能
printf("YES\n");
else
printf("NO\n");
return 0;
}
F-F
题目描述
冰冰子最近新学习了队列和栈两种重要的数据结构,他知道它们具有push 和pop操作。
而冰冰子现在想同时研究栈和队列,于是,他开始了一个实验。
现在,假设队列和栈都是空的。给定一系列push k和pop操作之后,冰冰子想知道队列和栈中分别存的数字。若队列或栈已经空了,仍然接收到pop操作,则输出error。
输入格式
第一行为m,表示有m组测试输入,m<100。
每组第一行为n,表示下列有n行push k或pop操作。(n<150)
接下来n行,每行是push k或者pop,其中k是一个整数。
(输入保证同时在队列或栈中的数不会超过100个)
输出格式
对每组测试数据输出两行,第一行是队列情况,若在队列空时收到pop操作,则输出error。其余情况将队列按照对头至队尾顺序输出队列中所有元素,中间用空格隔开。第二行是栈的情况,若在栈空时收到pop操作,则输出error。其余情况下按照栈底至栈顶的顺序输出栈中所有元素。
样例输入
2
4
push 1
push 3
pop
push 5
1
pop
样例输出
3 5
1 5
error
error
思路
用字符数组存输入的字符串然后用strcmp函数将输入的字符串与push和pop比较,如果是push就输入一个数字到栈和队列,是pop的话就把队首元素和栈顶元素弹出。
代码实现
#include<stdio.h>
#include<string.h>
int main()
{
int m;
scanf("%d",&m);
while(m--)
{
int n;
scanf("%d",&n);
//int top1,head,top2;
int a[2000],b[2000],sign=1;
int top1=1,top2=1,head=1;
for(int i=1; i<=n; i++)
{
char p[20];
scanf("%s",p);
if(p[0]=='p'&&p[1]=='u'&&p[2]=='s'&&p[3]=='h')//如果输入的字符串是push
{
int num;
scanf("%d",&num);//就输入一个数存入队列和栈
a[top1++]=num;
b[top2++]=num;
}
else if(p[0]=='p'&&p[1]=='o'&&p[2]=='p')//如果输入的字符是pop
{
head++;//出队首元素
top2--;//弹出栈顶元素
if(top2<1)//如果栈已经空了,还收到pop操作
sign=0;//就用一个sign标记
}
}
if(sign)
{
while(head<top1)
{
if(head!=top1)
printf("%d ",a[head++]);
if(head==top1)
printf("\n");
}
for(int i=1; i<top2; i++)
{
if(i!=top2-1)
printf("%d ",b[i]);
else
printf("%d\n",b[i]);
}
}
else printf("error\nerror\n");
}
return 0;
}
提前学习树和二叉树的基本知识
2.下午两个半小时
看了树和二叉树的讲解视频然后就是听学长讲课。
3.晚上两个小时
完成了补题的第四题。
Platforms
题目描述
在一坐标轴上给出n块板子,每个板子所占的空间为[(k-1)m,(k-1)m+l](l<m),一个青蛙从原点0起跳,每次跳d距离远,问最后青蛙会落在哪里(没落在板子上就结束跳跃) 输入:一行四个整数n,d,m,l 输出:一个整数,即青蛙最后的落点 1<=n,d,m,l<=10^6 l<m。
样例输入1
2 2 5 3
样例输出1
4
样例输入2
5 4 11 8
样例输出2
20
思路
最重要就是确定青蛙的位置,就说一下我前面答案一直错误的原因吧,我一直把板所占的空间认为是两块木板之间的空隙。
代码实现
#include<stdio.h>
int main()
{
long long int i=1,n,d,m,l,step=0,x,way=0;//n为板子的块数,d为青蛙每次跳跃的距离,m为每块板子之间的距离,l为每块板子的长度,step为青蛙跳的步数,x为最后落点的坐标
scanf("%lld %lld %lld %lld",&n,&d,&m,&l);
while(i<=n)
{
//step++;
long long int you=m*(i-1);//当前板子的左边界
long long int zuo=m*(i-1)+l;//当前板子的右边界
/*while((step*d)<=you)
step++;
if((step*d)>you&&(step*d)<zuo)
break;
if((step*d)>=zuo&&(step*d)<=(zuo+l))
i++;*/
if(way<you)//不在木板上
break;
if(way<=zuo)//在木板上
way=zuo/d*d+d;
i++;
}
printf("%lld",way);
return 0;
}