每日一题——晋升计数

408 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情

题目描述

奶牛贝茜正在帮助农夫约翰举办全美奶牛奥林匹克竞赛(USACO)。

这是一个线上比赛,参赛者通过回答具有挑战性的问题,来展示自己对牛的琐事的掌握。

为了迎合更大范围的参与者,约翰最近扩大了比赛范围,将比赛按难度分为四个组:铜、银、金和白金。

所有新的参赛者都从铜组开始,只要他们在比赛中取得完美的成绩,他们就会被提升到下一个更高的组。

一个参赛者甚至有可能在同一场比赛中被多次提升。

农夫约翰会记录所有参赛者的名单和他们当前所在的分组。

这样就可以在举办比赛时,让每个人都在属于自己水平的分组开始。

在公布最近一次比赛的结果时,约翰希望包含铜组晋升银组、银组晋升金组、金组晋升白金组的人员数量信息。

然而,在比赛中他却忘记统计每组的晋升人数了。

贝茜是一头聪明的奶牛,她发现可以仅根据比赛前后处于各个组别的人员数量来推断晋升的次数。

请帮她做出这个计算。

输入格式

共四行,每行两个整数。

第一行表示比赛前后铜组人员数量。

第二行表示比赛前后银组人员数量。

第三行表示比赛前后金组人员数量。

第四行表示比赛前后白金组人员数量。

输出格式

共三行,每行输出一个整数。

第一行整数表示铜组晋升银组的人数。

第二行整数表示银组晋升金组的人数。

第三行整数表示金组晋升白金组的人数。

数据范围

输入整数范围 0,106

输入样例:

1 2
1 1
1 1
1 2

输出样例:

1
1
1

样例解释

在此样例中,比赛前各组都只有 1 人,比赛后铜组和白金组各增加 1 人。

一种可能的情况是,赛后出现了两个新报名人员,加入铜组,赛前处于铜组的人员一路升入白金组。

思路

本题主要考察数学思维,仔细阅读题目后发现每组晋升的人数有一个通用性规律,即每组晋升人数 = 每组报名后的人数 - (本组报名前的人数 - 上一组晋升的人数)。那么这个公式可以自顶向下求解,白金组由于无法继续晋升,所以白金组的晋升数就等于本组报名后的人数 - 报名前的人数。

代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;
​
const int N = 10;
​
int a[N], b[N], c[N], d[N];
int x, y, z;
int main()
{
    for(int i = 1;i <= 2;i ++) cin >> a[i];
    for(int i = 1;i <= 2;i ++) cin >> b[i];
    for(int i = 1;i <= 2;i ++) cin >> c[i];
    for(int i = 1;i <= 2;i ++) cin >> d[i];
    
    z = d[2] - d[1];
    y = (b[2] - b[1]);
    x = (b[2] - b[1]);
    
    cout << x << endl;
    cout << y << endl;
    cout << z << endl;
    
    return 0;
}