B-吃苹果

假设苹果的数目用变量 xx 来表示,那么有:

x=0x = 0 的时候,应该输出 Today, I ate 0 apple.

x=1x = 1 的时候,应该输出 Today, I ate 1 apple.

x=2x = 2 的时候,应该输出 Today, I ate 2 apples.

x=3x = 3 的时候,应该输出 Today, I ate 3 apples.

\cdots

可以发现,无论 xx 的值是多少,紫色框圈起来的地方总是要输出的。

区别在于,在 x>1x > 1 这个条件满足后,后面加了个s

答案代码

#include <iostream> // 头文件
using namespace std; // 命名空间
int main() {
  int x; // 整数变量 x 来表示苹果的数量
  cin >> x; // 从键盘读入苹果的数量
  cout << "Today, I ate " << x << " apple";
  // 先输出总是要输出的
  if (x > 1) {
    cout << "s"; // 如果 x > 1 这个条件满足,补上s
  }
  cout << "."; // 不要忘记了末尾的句号
  return 0; // 表示程序正常退出
}

E-数字判断

纸质作业第四第五题的合体版,这个题的题意是要求我们记录一下一共多少有个条件被满足,如果都满足则输出 Yes,否则输出 No

我们需要一个额外的变量,用来表示满足条件的个数,如果某个条件得到满足,我们就让这个变量的值 +1+1

例如样例 11a=50,b=10,c=7a = 50, b = 10, c=7

对于第一个条件 a+b+c=76100a+b+c = 76 \le 100,满足 ✅

对于第二个条件 bb % 5 == 0,满足 ✅

对于第三个条件 cc % 7 == 0,满足 ✅

对于第四个条件 ab>bca - b > b - c,满足 ✅

四个条件都满足,输出 Yes,如果有个条件不满足则输出 No

Note:需要注意的是,本题数据范围是 2312^{31},会超过 int 的最大值,所以需要用 long long。

答案代码

#include <iostream>
using namespace std;

int main() {
  // a,b,c 含义如题所示,cnt 表示有多少个条件被满足,初始化为 0 表示一开始一个都不满足
  long long a, b, c, cnt = 0;
  cin >> a >> b >> c;
  if (a + b + c <= 100) {
    // cnt + 1 表示有一个条件满足
    cnt = cnt + 1;
  }
  // 下列代码逻辑相同,满足条件就加上一
  if (b % 5 == 0) {
    cnt = cnt + 1;  
  }
  if (c % 7 == 0) {
    cnt = cnt + 1;  
  }
  if (a - b > b - c) {
    cnt = cnt + 1;  
  }
  // 判断 cnt 的个数,如果都满足那么 cnt 应该是 4
  if (cnt == 4) {
    cout << "Yes";  
  } else {
    cout << "No";  
  }
  return 0;
}

F-等差数列末项计算

数学知识补充

根据题目定义,等差数列是一个前后两个数固定差值的数列。

例如 1,2,3,4,5,61,2,3,4,5,6 就是个等差数列,前后两个数字之间的差值为 11.

更多的例子还有:

  • 1,3,5,7,9,111,3,5,7,9,11,差值 d=2d = 2

  • 0,2,4,6,8,100,2,4,6,8,10,差值 d=2d = 2

题目给出了第一项和第二项,通过这两个数字,我们可以求出来他们之间固定的差值是多少,下面称这个差值为公差 dd

例如样例给出的前两个数字是 1144,那么公差 d=41=3d=4-1=3,也就是后一个数字比前一个数字多 33

解题思路

如果没有学习过等差数列,本题依然可以解决。

在纸上找规律,以样例举例,样例的公差 d=3d = 3

第一个数字是 11

第二个数字是 1+3=41+3=4

第三个数字是 1+3+3=71 + 3 + 3 = 7

第四个数字是 1+3+3+3=101 + 3 + 3 + 3 = 10

\cdots

以此类推,每次往后算多一个数字,答案就是上一个数字加多一个公差 dd

通过观察,我们可以发现,第四个数字加了三个公差,第三个数字加了两个公差 \cdots

规律就是:第 xx 个数字,需要加上 x1x-1 个公差。

更正式的,我们称第一个数字为 a1a_1,公差为 dd,那么有这么一个规律,第 nn 个数字是 an=a1+(n1)da_n = a_1 + (n-1)d

答案代码

#include <iostream>
using namespace std;
int main() {
  int a, b, n; // 第一个数字,第二个数字,和要求的第 n 个数字
  cin >> a >> b >> n;
  int d = b - a; // 后一个数字减前一个数字得到公差
  cout << a + (n-1) * d << '\n'; // 根据规律直接求解
  return 0;
}

G-小鱼的游泳时间

题意概括:给定一个开始时间和结束时间,问从开始时间到结束时间一共是多少小时多少分钟。

假设开始时间是 aa 小时 bb 分,结束时间是 cc 小时 dd 分,一共会有以下两种情况;

  • b <= d
  • b > d

对于第一种情况,答案显然就是结束时间的小时 - 开始时间的小时,结束时间的分钟 - 开始时间的分钟即可。

对于第二种情况,分钟不够减,我们需要从小时里「借位」,因为分钟转换小时是 6060 进制,所以会让结束时间的分钟加上 6060

以样例来说,12125050 分开始游泳,19191010 分结束游泳。

那么就是第二种情况,小时差为 1912=719 - 12 = 7,我们需要从 77 那里借一个 11 过来。

那么分钟就是 1050+60=2010 - 50 + 60 = 20

答案就是 66 小时 2020 分。

#include <iostream>
using namespace std;
int main() {
  int a, b, c, d;
  cin >> a >> b >> c >> d;
  // d1 表示小时差
  int d1 = c - a;
  // d2 表示分钟差
  int d2 = d - b;
  // 如果开始时间的分钟大于结束时间的分钟
  // 向小时借一位
  if (d2 < 0) {
    // d1 借了一小时出去
    d1 = d1 - 1;
    // 一小时=60分钟,所以加了60
    d2 = d2 + 60;
  }
  cout << d1 << ' ' << d2 << '\n';
  return 0;
}