思维问题解决

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

 

转载于:https://www.cnblogs.com/Aiahtwo/p/11184480.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值