一,题目:
Arbalest
给了Rain Sure
n个小方格。
并且其中有m个小方格的颜色是蓝色的,分别为a1,a2,a3,⋯,am,其余均为白色。
Arbalest
让Rain Sure
任意选择一个正整数k.
Rain Sure
同学之后可以进行如下操作,选定一个长度为k的连续小方格(其中不许出现蓝色),将他们全部染成红色。
Arbalest
让Rain Sure
把这n个小方格中白色的小方格全部变成红色。
请你帮助Rain Sure
同学决定正整数k,并求出最少需要的操作次数。
输入格式
第一行包括两个整数,分别代表n和m。
第二行m个正整数a1,a2,⋯,am,其中ai代表第i个蓝色小方格的位置。
1≤n≤109
0≤m≤2×105
1≤ai≤n
保证ai各不相同
全部输入均为整数。
输出格式
请你输出最少需要的操作次数
测试样例一
5 2
1 3
3
说明:Rain Sure
同学如果选择k=1,只需要操作3次,此时最优。
如果选择k≥2,那么他将无法将2号小方格变为红色。
测试样例二
13 3
13 3 9
6
说明:最优的选择是k=2。
将1, 2号小方格染色为红色。
将4, 5号小方格染色为红色。
将5, 6号小方格染色为红色。
将7,8号小方格染色为红色。
将10,11号小方格染色为红色。
将11,12号小方格染色为红色。
测试样例三
5 5
5 2 1 4 3
0
说明:没有白色小方格需要被染色。
测试样例四
1 0
1
二,思路:
由于可以重叠染色(已经染过的还可以再然一次),那么是不是k越大操做次数越少,k最大就要看,所有蓝快差距中,最小的那一个。
三,代码:
#include <iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
#include<stack>
#include<queue>
#include<map>
using namespace std;
const int N=2e5+10,M=1e9+7;
typedef long long ll;
typedef pair<int,int> pii;
int arr[N];
void Solved() {
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>arr[i];
sort(arr+1,arr+m+1);
set<int> s;
vector<int> v;
//计算差距
for(int i=2;i<=m;i++){
if(arr[i]-arr[i-1]-1>0) v.push_back(arr[i] - arr[i - 1] - 1);
}
//开头和结尾的差距不要忘了,当然我这里是直接将差距为零的个筛掉了
if(arr[1]>1) v.push_back(arr[1]-1);
if(arr[m]<n) v.push_back(n-arr[m]);
sort(v.begin(),v.end());
//向上取整即使答案
ll sum=0;
for(int i=0;i<v.size();i++) {
sum+=(v[i]+v[0]-1)/v[0];
}
cout<<sum<<endl;
}
int main()
{
int t;
//cin>>t;
t=1;
while(t--) {
Solved();
}
return 0;
}