本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

题目链接:CF796E

正解:$DP$

解题报告:

  考虑用$f[i][j][x][y]$表示考虑完前$i$个问题,当前总共用了$j$次机会,对于第一个人还能看$x$道题,第二个人还能看$y$道题的最优值,考虑$x$和$y$等于$0$的情况,直接转移就好了。

  这里写转出可能会方便一些。

  注意到这个复杂度是$O(npk^2)$的,但是当$p>\frac{2*n}{k}$时,可以全选,那么直接全选就好了,特判一下,所以复杂度是$O(n^2k)$。

//It is made by ljh2000
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <queue>
#include <cmath>
#include <ctime>
#define lc root<<1
#define rc root<<1|1
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define reg(i,x) for(int i=first[x];i;i=next[i])
using namespace std;
typedef long long LL;
const int MAXN = 1002;
int n,p,k,a[MAXN],b[MAXN],ans;
int n1,n2,f[2][MAXN][52][52];
//f[i][j][x][y]表示考虑完前i个问题,当前总共用了j次机会,第一个人还能看x道题,第二个人还能看y道题的最优值
inline void upd(int &x,int y){ if(y>x) x=y; }
inline int getint() {
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline void work(){
n=getint(); p=getint(); k=getint();
n1=getint(); for(int i=1;i<=n1;i++) a[getint()]++;
n2=getint(); for(int i=1;i<=n2;i++) b[getint()]++;
int lim=n/p; if(n%p!=0) lim++; lim<<=1;
if(k>=lim) {
//printf("%d",n1+n2);
for(int i=1;i<=n;i++) ans+=a[i]|b[i];
printf("%d",ans);
return ;
} memset(f,-0x3f,sizeof(f)); f[0][0][0][0]=0; int to,tag=1;
for(int i=1/*!!!*/;i<=n;i++) {
to=tag; memset(f[to],-0x3f,sizeof(f[to]));//!!!
tag^=1;
for(int j=0;j<=p;j++) {
for(int ii=0;ii<=k;ii++) {
for(int jj=0;jj<=k;jj++) {
if(!ii && !jj) {
upd(f[to][j][0][0],f[tag][j][0][0]);
upd(f[to][j+1][k-1][0],f[tag][j][0][0]+a[i]);
upd(f[to][j+1][0][k-1],f[tag][j][0][0]+b[i]);
upd(f[to][j+2][k-1][k-1],f[tag][j][0][0]+(a[i]|b[i]));
}
else if(!ii) {
upd(f[to][j][0][jj-1],f[tag][j][0][jj]+b[i]);
upd(f[to][j+1][k-1][jj-1],f[tag][j][0][jj]+(a[i]|b[i]));
upd(f[to][j+2][k-1][k-1],f[tag][j][0][jj]+(a[i]|b[i]));
}
else if(!jj) {
upd(f[to][j][ii-1][0],f[tag][j][ii][0]+a[i]/*!!!*/);
upd(f[to][j+1][ii-1][k-1],f[tag][j][ii][0]+(a[i]|b[i]));
upd(f[to][j+2][k-1][k-1],f[tag][j][ii][0]+(a[i]|b[i]));
}
else upd(f[to][j][ii-1][jj-1],f[tag][j][ii][jj]+(a[i]|b[i]));
}
}
}
}
tag^=1;
for(int l=0;l<=p;l++)
for(int i=0;i<=k;i++)
for(int j=0;j<=k;j++)
ans=max(ans,f[tag][l][i][j]);
printf("%d",ans);
} int main()
{
#ifndef ONLINE_JUDGE
freopen("796.in","r",stdin);
freopen("796.out","w",stdout);
#endif
work();
return 0;
}
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

  

codeforces796E Exam Cheating的更多相关文章

  1. Codeforces 796E - Exam Cheating(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 当被数据结构搞自闭的 tzc 信心满满地点开一道 *2400 的 dp 题时-- 却发现自己不会做?! 这足以证明蒟蒻 dp 之菜/dk/ ...

  2. Codeforces Round #408 (Div. 2)

    C. Bank Hacking 题目大意:给出一棵n个节点的树,每个节点有一个权值,删掉一个点的代价为当前这个点的权值,并且会使其相邻点和距离为2且中间隔着未被删除的点的点权值加1,现在选一个点开始删 ...

  3. Codeforces Round #408 (Div. 2) 题解【ABCDE】

    A - Buying A House 题意:给你n个房间,妹子住在第m个房间,你有k块钱,你想买一个离妹子最近的房间.其中相邻的房间之间距离为10,a[i]=0表示已经被别人买了. 题解:扫一遍更新答 ...

  4. Codeforces Round #408( Div2)

    Bank Hacking 阅读题,读完之后手算一下可以发现每一个bank被hack所需要的strength无非分为三种情况. 1. $a_i$,当且仅当i为第一个选择的点. 2. $a_i+1$,当且 ...

  5. Linux学习之Exam系统发布

    配置时间:2015年11月27日 配置人:撰写人:微冷的雨   Happy 01.Linux安装图 欢迎页面 桌面 02.Linux命令之文件目录操作 给北大青鸟五道口校区创建三个机房(L4,L5,L ...

  6. CF534A Exam 构造

    An exam for n students will take place in a long and narrow room, so the students will sit in a line ...

  7. CF Exam (数学)

     Exam time limit per test 1 second memory limit per test 256 megabytes input standard input output s ...

  8. Exam 70-462 Administering Microsoft SQL Server 2012 Databases 复习帖

    好吧最近堕落没怎么看书,估计这个月前是考不过了,还是拖到国庆之后考试吧.想着自己复习考试顺便也写点自己的复习的概要,这样一方面的给不准备背题库的童鞋有简便的复习方法(好吧不被题库的同学和我一样看MSD ...

  9. Final Exam Arrangement(ZOJ)

    In Zhejiang University, there are N different courses labeled from 1 to N. Each course has its own t ...

随机推荐

  1. Supervisor快速上手指南(转)

    原文:http://maemual.me/index.php/archives/8/ Supervisor是一个进程控制程序.用于监控管理你需要的程序. 当你有一个程序,需要长期在后台运行,并且希望能 ...

  2. 10张Gif动图让你弄懂递归等概念

    图像(包括动图)是传递信息的一种高效方式,往往能增强表象.记忆与思维等方面的反应强度.所谓一图胜千言,说的就是这个道理. 今天为大家整理了十张动图GIFS,有助于认识循环.递归.二分检索等概念的具体运 ...

  3. 图书源代码下载: Modern Differential Geometry of CURVES and SURFACES with Mathematica

    http://alpha01.dm.unito.it/personalpages/abbena/gray/ Contents   1. Curves in the Plane |   2. Famou ...

  4. PHP命名空间-总结

    首先创建三个文件: one.php.two.php.three.php one.php namespace a\b\c; class Type { function getInfo(){ echo & ...

  5. php内存溢出,出现Allowed memory size of 8388608 bytes exhausted错误的解决办法

    是因为php页面消耗的最大内存默认是为128M (在PHP的ini件里可以看到) ,如果文件太大或图片太大在读取的时候会发生上述错误. 解决办法: 1.修改 php.ini 将memory_limit ...

  6. Java中的反射[转载]

    转自:https://blog.csdn.net/sinat_38259539/article/details/71799078#commentBox 1.什么是反射? 反射是通过一个类可以知道其中所 ...

  7. windows平台mongoDB安装配置

    一.首先安装mongodb 1.官网下载mongoDB:http://www.mongodb.org/downloads,选择windows平台.安装时,一路next就可以了.我安装在了F:\mong ...

  8. 如何将python3.6软件的py文件打包成exe程序

    在我们完成一个Python项目或一个程序时,希望将Python的py文件打包成在Windows系统下直接可以运行的exe程序.在浏览网上的资料来看,有利用pyinstaller和cx_Freeze进行 ...

  9. 高并发下hystrix熔断超时及concurrent.RejectedExecutionException: Rejected command because thread-pool queueSize is at rejection threshold问题

    我的一个项目并发200+,观察服务器的日志发现出现了大量的熔断超时偶尔会闪现出RejectedExecutionException: Rejected command because thread-p ...

  10. android线程学习心得

    有一篇关于android线程讲的非常好,大家可以参考下,其中有一句话讲的非常好,就拿来做开篇之句: 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主 ...