思维问题解决

1.问题描述:对于长度为n的数列(该数列的元素为1~n),从里面选出m个特殊数,另外对该数列进行分页处理(每一页的长度为k)

我们每一次对一页中的所有特殊数字进行清除处理,从头遍历每一页,清除该页的特殊数字,另外清除了数字,后面所有的数字会往前替补。求需要处理多少次(清除含特殊数字的页数的次数)

举例:

n=10  m=4   k=5

1 2 3 4 5 | 6 7 8 9 10

其中特殊字为2 4 7 9

第一次处理:处理第一页的2,4    该数列变为: 1 3 5 6 7 | 8 9 10

第二次处理:处理第一页的7    该数列变为:1 3 5 6 8 | 9 10

第三次处理:处理第二页的9    该数列变为:1 3 5 6 8 |10

所以需要处理三次

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll n,m,k;
    cin>>n>>m>>k;
    vector<long long> v(m);
    for(ll i=0;i<m;i++)
       cin>>v[i];
    ll t=0,r=0;
    while(t<m)
    {
        ll h=((v[t]-t+k-1)/k)*k+t;//该页的最后一个数字
        while(v[t]<=h&&t<m)
        {
            t++;//t的增值代表这页包含的特殊数字个数
        }
        r++;
    }
     cout<<r<<endl;
}
扫描二维码关注公众号,回复: 6802650 查看本文章

猜你喜欢

转载自www.cnblogs.com/Aiahtwo/p/11184480.html