gesp(C++五级)(1)洛谷:B3941:[GESP样题 五级] 小杨的锻炼
题目描述
小杨的班级里共有 n n n 名同学,每位同学都有各自的锻炼习惯。具体来说,第 i i i 位同学每隔 a i a_i ai 天就会进行一次锻炼(也就是说,每次锻炼会在上一次锻炼的 a i a_i ai 天后进行)。某一天,班上的 n n n 名同学恰好都来进行了锻炼。他们对此兴奋不已,想要计算出下一次所有同学都来锻炼,至少要过多少天。但他们不会计算,你能帮帮他们吗?
输入格式
第一行一个整数
n
n
n,表示同学的数量。
第二行
n
n
n 个用空格隔开的正整数,依次为
a
0
,
a
1
,
…
,
a
n
−
1
a_0, a_1, …, a_{n-1}
a0,a1,…,an−1。
输出格式
输出一个整数,表示下一次所有同学都来锻炼,至少要过多少天。
样例 #1
样例输入 #1
3
1 2 3
样例输出 #1
6
样例 #2
样例输入 #2
4
2 4 8 16
样例输出 #2
16
样例 #3
样例输入 #3
4
2 4 6 8
样例输出 #3
24
提示
样例 1 解释
第一位同学每天都锻炼;第二位同学每 2 2 2 天锻炼一次;第三位同学每 3 3 3 天锻炼一次。因此, 6 6 6 天之后,三位同学都会进行锻炼。在此之前,第二位同学只会在第 2 , 4 2, 4 2,4 天进行锻炼,第三位同学只会在第 3 3 3 天进行锻炼,他们都无法相遇。
样例 2 解释
第四位同学每 16 16 16 天锻炼一次,而 16 16 16 天后也恰好是前三位同学锻炼的日子。
数据规模与约定
- 对 20 % 20\% 20% 的数据, n = 2 n = 2 n=2。
- 对 50 % 50\% 50% 的数据, n = 4 n = 4 n=4。
- 对 100 % 100\% 100% 的数据, 2 ≤ n ≤ 10 2 \leq n \leq 10 2≤n≤10, 1 ≤ a i ≤ 50 1 \leq a_i \leq 50 1≤ai≤50。
AC代码(100分)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
/*思路:
枚举查找能同时整除所有数的数(找到的第1个就是答案)
如果从1开始每次递增1枚举,部分测试会超时
可以从最大数开始枚举,每次递增最大数
*/
ll n,a[20];
int main(){
cin>>n;
ll maxn=0;//存所有数的最大数
for(int i=1;i<=n;i++){
cin>>a[i];
maxn=max(maxn,a[i]);
}
for(ll day=maxn;;day+=maxn){
int cnt=0;//统计整除的数量
for(int i=1;i<=n;i++){
if(day%a[i]==0) cnt++;
}
if(cnt==n){//找到能整除所有数的数
cout<<day;//输出
return 0;//结束程序
}
}
return 0;
}
文末彩蛋:
点击王老师青少年编程主页有更多精彩内容