PTA----->染色问题

一,题目:

Arbalest给了Rain Suren个小方格。

并且其中有m个小方格的颜色是蓝色的,分别为a1​,a2​,a3​,⋯,am​,其余均为白色。

ArbalestRain Sure任意选择一个正整数k.

Rain Sure同学之后可以进行如下操作,选定一个长度为k的连续小方格(其中不许出现蓝色),将他们全部染成红色。

ArbalestRain 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;
}

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值