Description
Input
输入的第一行包含两个整数
N
,
Output
仅输出一个数,表示最多可以让多少个小朋友高兴。
样例输入1
14 5 5
2 1 2 4 2 6
3 1 1 6 4
6 1 2 9 6 8
8 1 1 9 12
12 3 0 12 13 2
样例输入2
12 7 6
1 1 1 1 5
5 1 1 5 7
5 0 3 5 7 9
7 1 1 7 9
9 1 1 9 11
9 3 0 9 11 1
样例输出1
5
样例输出2
6
HINT
Source
思路
设
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
const int maxn=10000;
int f[maxn+10][32],g[maxn+10][32];
int n,m,ans;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++)
{
int w,l,h,lv=0,hv=0;
scanf("%d%d%d",&w,&l,&h);
for(int j=1; j<=l; j++)
{
int k;
scanf("%d",&k);
k=(k+n-w)%n;
lv|=1<<k;
}
for(int j=1; j<=h; j++)
{
int k;
scanf("%d",&k);
k=(k+n-w)%n;
hv|=1<<k;
}
for(int j=0; j<32; j++)
{
if((lv&j)||(hv&(31^j)))
{
g[w][j]++;
}
}
}
for(int s=0; s<16; s++)
{
memset(f[0],200,sizeof f[0]);
f[0][s<<1]=0;
for(int i=1; i<=n; i++)
{
for(int j=0; j<32; j++)
{
f[i][j]=std::max(f[i-1][(j&15)<<1],f[i-1][(j&15)<<1|1])+g[i][j];
}
}
ans=std::max(ans,std::max(f[n][s<<1],f[n][s<<1|1]));
}
printf("%d\n",ans);
return 0;
}