前言
ACWing每日一题(2022.4.10):ACWing1854.晋升计数
一、题目
题目链接: ACWing1854.晋升计数.
奶牛贝茜正在帮助农夫约翰举办全美奶牛奥林匹克竞赛(USACO)。
这是一个线上比赛,参赛者通过回答具有挑战性的问题,来展示自己对牛的琐事的掌握。
为了迎合更大范围的参与者,约翰最近扩大了比赛范围,将比赛按难度分为四个组:铜、银、金和白金。
所有新的参赛者都从铜组开始,只要他们在比赛中取得完美的成绩,他们就会被提升到下一个更高的组。
一个参赛者甚至有可能在同一场比赛中被多次提升。
农夫约翰会记录所有参赛者的名单和他们当前所在的分组。
这样就可以在举办比赛时,让每个人都在属于自己水平的分组开始。
在公布最近一次比赛的结果时,约翰希望包含铜组晋升银组、银组晋升金组、金组晋升白金组的人员数量信息。
然而,在比赛中他却忘记统计每组的晋升人数了。
贝茜是一头聪明的奶牛,她发现可以仅根据比赛前后处于各个组别的人员数量来推断晋升的次数。
请帮她做出这个计算。
输入格式
共四行,每行两个整数。
第一行表示比赛前后铜组人员数量。
第二行表示比赛前后银组人员数量。
第三行表示比赛前后金组人员数量。
第四行表示比赛前后白金组人员数量。
输出格式
共三行,每行输出一个整数。
第一行整数表示铜组晋升银组的人数。
第二行整数表示银组晋升金组的人数。
第三行整数表示金组晋升白金组的人数。
数据范围
输入整数范围 [0,106]。
输入样例:
1 2
1 1
1 1
1 2
输出样例:
1
1
1
样例解释
在此样例中,比赛前各组都只有 1 人,比赛后铜组和白金组各增加 1 人。
一种可能的情况是,赛后出现了两个新报名人员,加入铜组,赛前处于铜组的人员一路升入白金组。
二、解题思路
a数组存储比赛前每组人数,b数组存储比赛后每组人数,res数组存储晋升人数即输出结果。
res[4] = b[4]-a[4]:金->白金
res[3] = b[3]-a[3]:银->金 + res[4]:(银->)金->白金
res[2] = b[2]-a[2]:铜->银 +res[3]:(铜->)银->金、(铜->银->)金->白金
所以可以倒着遍历,由上级结果推出下面的。
这里为什么需要算后面的,是因为“一个参赛者甚至有可能在同一场比赛中被多次提升”这句话,例如,一个人本来是银组的,然后他一直晋升到了白金组,但是他也算是银组晋升金组人数里面的。
举个类似的例子,一个人做了4次核酸,那么这个人肯定也做了3次核酸。
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 1000
int main(){
int a[MAX],b[MAX],res[MAX];
for(int i=1;i<=4;i++){
scanf("%d %d",&a[i],&b[i]);
}
memset(res,0,sizeof(res));
for(int i=4;i>=2;i--){
res[i] = res[i+1]+b[i]-a[i];
}
for(int i=2;i<=4;i++){
printf("%d\n",res[i]);
}
return 0;
}