「生活可以更简单, 欢迎来到我的开源世界」
  1. [编程题]序号3
    1. 题目描述
    2. 思路描述
  2. [编程题]序号4
    1. 题目描述
    2. 思路描述
  3. [编程题]序号5
    1. 题目描述
    2. 思路描述
    3. 基姆拉尔森计算公式
  4. [编程题]序号6
    1. 题目描述
    2. 思路描述
牛客网-4399-笔试测试题
2020-07-31

今天做了牛客网上的4399笔试测试题,只做出了两道。

[编程题]序号3

题目描述

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?(n<=10)

输入描述:

一行,一个整数n (1<=n<=10)。

输出描述:

输出两个浮点数ans1,ans2。ans1为第n次落地时,共经过的距离;ans2为第n次反弹的高度。答案应与标准答案误差小于1e-5。两个数间以空格相间。

输入例子1:

1

输出例子1:

100.000000 50.000000

输入例子2:

10

输出例子2:

299.609375 0.097656

思路描述

#include <iostream>
#include <iomanip>
using namespace std;

int main(int argc, char *argv[]){
cout << fixed << setprecision(6);
int n;
cin >> n;
if(n < 1)return 0;
double all = 0, end = 100;
for(int i = 0; i < n; i++){
all += end;
end /= 2;
all += end;
}
cout << all-end << ' ' << end;
return 0;
}

[编程题]序号4

题目描述

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

输入描述:

一行,一个正整数n(1<=n<=1000000)。

输出描述:

输出答案。

输入例子1:

5

输出例子1:

4

例子说明1:

出局的编号依次为3,1,5,2,最后留下的是4

思路描述

典型的环形链表,处理约瑟夫环问题

[编程题]序号5

题目描述

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

小陆每天要写一份工作日报,日报标题含有日期。几年后,他翻开以前的日报,想知道两份日报的日期是否同为星期几,请编程帮助他判断。

输入描述:

第一行一个正整数T(1<=T<=100)。表示有T个测试样例。
接下来T行,每一行有6个正整数y1,m1,d1,y2,m2,d2,(以空格相间)。其中y1-m1-d1分别为第一个日期的年月日,y2-m2-d2分别为第二个日期的年月日。(满足1970<=y1,y2<=9999, 1<=m1,m2<=12, 1<=d1,d2<=31,且保证两个日期是合法的)。

输出描述:

输出T行,对应T个答案。对于每一行,如果两个日期在同一周,输出“True”;否则输出“False”(输出内容不含双引号)。

输入例子1:

2
1970 1 2 2020 2 7
2020 1 1 2020 1 2

输出例子1:

True
False

例子说明1:

1970-1-2和2020-2-7同为星期五;
2020-1-1为星期三,2020-1-2为星期四。

思路描述

计算两个日期之间的天数,

我们以题目样例1970-1-2星期五为的前一天1970-1-1为基准,这也是题目给的日期范围

需要注意每个月的天数、闰年等情况。

#include <stdio.h>

int CaculateWeekDay(int y,int m, int d)
{
if(m==1||m==2) {
m+=12;
y--;
}
int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
return iWeek + 1;
}

int main(){
int T;
scanf("%d", &T);
for(int i = 0; i < T; i++){
int y1, m1, d1, y2, m2, d2;
scanf("%d %d %d %d %d %d", &y1, &m1, &d1, &y2, &m2, &d2);
if(CaculateWeekDay(y1, m1, d1) == CaculateWeekDay(y2, m2, d2)){
printf("True\n");
}else{
printf("False\n");
}
}
return 0;
}

基姆拉尔森计算公式

  1. 用途:给你年月日,计算今天星期几

  2. 公式:Week = (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1) mod 7;

    1. d为几号
    2. m为月份
    3. y为年份
  3. 注:把一月和二月看为是上一年的十三月和十四月!!

  4. 样例:

    int Date(int y,int m,int d)
    {
    if(m==1||m==2){//一二月换算
    m+=12;
    y--;
    }
    int week = (d + 2*m +3*(m+1)/5 + y + y/4 - y/100 + y/400 + 1)%7;
    return week;//其中1~7表示周一到周日
    }

[编程题]序号6

题目描述

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

段誉身具凌波微波,动无常则,若危若安,一次能走一级台阶或者两级台阶,他要爬一段30级的山路,问有多少种走法?分析如何计算,然后编程解答。
进阶问题:当他轻功熟练度提升,一次最多可以走三级,那就结果有什么变化?后来走火入魔了,不能走一级,只能走二或三级,又有什么变化?

输入描述:

输入一个数n(1<=n<=30),代表段誉要爬一段n级的山路。

输出描述:

输出三个整数a,b,c(以空格相间)。其中a为段誉一次能走一级或两级台阶的走法;b为段誉一次能走一级、二级或三级台阶的走法;c为段誉一次能走二级或三级台阶的走法。

输入1

3

输出1

3 4 1

思路描述

爬楼梯问题,动态规划,当前楼梯的可能情况由可以到当前楼梯的楼梯的可能情况决定。

状态方程:

#include <iostream>
using namespace std;
int a[31];
int b[31];
int c[31];
int main(){
int n;
cin >> n;
b[1] = a[1] = 1;
b[2] = a[2] = 2;
a[3] = 3;
b[3] = 4;
c[1] = 0;
c[2] = 1;
c[3] = 1;
for(int i = 4; i <= n; i++){
a[i] = a[i-2] + a[i-1];
b[i] = b[i-3] + b[i-2] + b[i-1];
c[i] = c[i-3] + c[i-2];
}
cout << a[n] << ' ' << b[n] << ' ' << c[n];
return 0;
}
<⇧>