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