欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

E. K Balanced Teams

程序员文章站 2022-06-10 17:17:10
类比背包问题,为每个学生附加一个权重$pos[i]$,意思是选择该学生后,之后可以选择$p[i]~p[i]+5$的学生。 转换公式: $$d[i][j]=max(d[i+1][q],d[i+pos][i] pos[i])$$ c++ include using namespace std; int ......

类比背包问题,为每个学生附加一个权重$pos[i]$,意思是选择该学生后,之后可以选择$p[i]~p[i]+5$的学生。

转换公式:
$$d[i][j]=max(d[i+1][q],d[i+pos][i]-pos[i])$$

#include<bits/stdc++.h>
using namespace std;
int p[5005],d[5005][5005],pos[5005];
int n;
int f(int i,int q){
    if(q==0||i>n)return 0;
    int& ans=d[i][q];
    if(ans) return ans;
    return ans=max(f(i+1,q),f(i+pos[i],q-1)+pos[i]);
}
int main(){
    int m;
    cin>>n>>m;
    for(int i{1};i<=n;i++) cin>>p[i];
    sort(p+1,p+n+1);
    for(int i=1;i<=n;i++) pos[i]=upper_bound(p+1,p+n+1,p[i]+5)-p-i;
    cout<<f(1,m)<<endl;
return 0;
}