【原创】【NOIP】海港的船只

来源:互联网 发布:mysql高级教程 编辑:程序博客网 时间:2024/05/09 13:07

海港的船只(ship.cpp)

时间限制: 1 Sec  内存限制: 128 MB
提交: 187  解决: 138

题目描述

Miku 生活在一个小镇上,这个小镇上有一个海港,很少有船只过来停靠。很难得的,有一天所有的船只都来到了这个海港。Miku记下了这个日子,把它列为第一天.从那以后,只要有船来到这个港口,(假设不会再有新的船)Miku都会记下这个日子。Miku发现所有的船来到这个港口都是周期性的。比如某艘船的周期为3,则它来到这个港口的日子分别为1,4,7,10等等。

给出Miku记录的日子的一个列表(包含今天,当然今天也有船只过来),计算出最少有多少只船来到这个港口。

输入

第一行包含一个整数N(2<=N<=5000),记录的天数。

接下来的N行包含N个数,表示记录的N个日子。这N个数是升序排列的。第一个数表示Miku开始记录的第一天,最后一个数表示今天。第一个数总是1,最后一个数表示今天,小于1000000000

输出

 第一行也是唯一的一行,输出最小的船只数。

样例输入

3134

样例输出

2

提示


记录了三个日子,分别是第1天,第3天,第4天,所以最少有2条船来到这个港口。一条周期为2,一条周期为3.



这道题看起来很水的样子,怎么做这道题呢?
先把所有日子给输入,蓝后开始搜索。
如果这一天在前面的周期里,就删去它。最后再看看有多少没被删去,就可以了。
但是!
怎么判断周期呢?

如果这个数-1(a[i]),除以另一个数-1(a[j],j<i)的余数为0,那么a[i]就在a[j]的周期上了。
为什么要“-1”呢?
举个例子。
比如,输入数据为1 3 5,1 3的周期为(3-1)天一艘船,(5-1)整除(3-1),5也在3(2天一船)的周期上。所以删去5,答案就为1。

#include<iostream>  #include<cstdio>  #include<cstring>  #include<string>  #include<algorithm>  #include<cmath>  #include<cstdlib>  #include<queue>  #include<stack>  #include<map>    #include<vector>    #include<functional>    using namespace std;int a[5123],lol,n,t=0;int main(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=2;i<=n;i++)if(a[i]) {t++;for(int j=i+1;j<=n;j++)if((a[j]-1)%(a[i]-1)==0) a[j]=0;}printf("%d",t);}






















1 1
原创粉丝点击