打卡信奥刷题(1641)用C++信奥 P7633 [COCI 2010/2011 #5] BRODOVI

P7633 [COCI 2010/2011 #5] BRODOVI

题目描述

Mirko 住在一个难得有船经过的有港口的小镇上。然而,直到今天,Mirko 还记得那天所有造访过这个港口的船只都出现了。他用索引 1 1 1 表示这一天。

许多天过去了,Mirko 记下了至少有一艘船访问港口的日子,把这些日子命名为娱乐日。

此外,Mirko 注意到每艘船都定期访问港口。例如,长度为 3 3 3 的间隔表示某艘船在第 1 1 1 天、第 4 4 4 天、第 7 7 7 天、第 10 10 10 天等时间访问港口。

给出 Mirko 的娱乐日列表(包括今天,且今天也是一个娱乐日),计算访问他的港口的最小可能的船只数量。

注:所有娱乐日都出现在 Mirko 的列表上,保证永远存在答案。

输入格式

输入的第 1 1 1 行包含一个整数 N N N,即娱乐天的个数。

下面 N N N 行,每行一个整数 A i A_i Ai,表示表上的娱乐天数,按升序排列。第一个和最后一个娱乐天分别是 Mirko 开始监测港口交通的日期和今天。今天将一直出现在列表上。第一个索引总是 1 1 1

输出格式

输出共一行,一个整数,为最小的访问 Mirko 的港口的船舶的数量。

输入输出样例 #1

输入 #1

3
1
3
4

输出 #1

2

输入输出样例 #2

输入 #2

5
1
7
10
13
19

输出 #2

2

输入输出样例 #3

输入 #3

3
1
500000000
999999999

输出 #3

1

说明/提示

【样例说明#1】

最少需要两条船,第一条每 2 2 2 天来一次,第二条每 3 3 3 天来一次。

【数据范围】

对于 70 % 70\% 70% 的数据, A i ≤ 5 × 1 0 6 A_i\le 5\times 10^6 Ai5×106

对于 100 % 100\% 100% 的数据, 2 ≤ N ≤ 5000 2\le N\le 5000 2N5000 1 ≤ A i ≤ 1 0 9 1 \le A_i\le 10^9 1Ai109

【说明】

【说明】

本题分值按 COCI 原题设置,满分 70 70 70

题目译自 COCI2010-2011 CONTEST #5 T3 BRODOVI

C++实现

#include<bits/stdc++.h>
using namespace std;
const int N=5005;
int n,ans,cur,a[N];
bool vis[N];
bool break_;
int main() {
	cin>>n;
	for(int i=1; i<=n; i++) {
		cin>>a[i];
		a[i]--;//先减一
	}
	cur=2;//初始化
	while(1) {
		for(int i=cur; i<=n; i++) {//找第一个没标记的点
			if(!vis[i]) {
				cur=i;
				++ans;
				break;
			} else if(i==n) {
				break_=1;//标记结束while
			}
		}
		if(break_){//退出while
			break;
		}
		for(int i=cur; i<=n; i++) {//标记倍数
			if(a[i]%a[cur]==0) {
				vis[i]=1;
			}
		}
	}
	cout<<ans;
	return 0;
}

在这里插入图片描述

后续:

接下来我会不断用C++来实现信奥比赛中的算法题、C++考级编程题实现、白名单赛事考题实现,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值