BZOJ3877 : [Ahoi2014&Jsoi2014]保龄球
考虑从前往后放所有轮。
如果上一轮是全中:
那么这一轮如果是补中,一定放第一次最小的,这样可以让第一次大的放在其它补中之后。
如果这一轮是失误,那么一定放总分最大的。
如果上一轮是补中:
这一轮一定放第一次最大的。
所以每次要么放补中里第一次最小的,要么放补中里第一次最大的。
最优解中一定是全中补中先交替放,直到一方不足,然后按照剩下那一放对失误轮进行贪心。
因为最后第二轮的限制,最后一轮可能是个特例,因此枚举哪轮失误是特例,再枚举失误轮贪心策略是按照总分还是第一次从大到小取,然后DP求最优解。
将补中按照第一次得分排序,设$f[i][l][r][j][k][o]$表示已经放了$i$个全中,还没放的补中是区间$[l,r]$,已经放了前$j$个非特例失误轮,特例有没有放为$k$,目前最后放的那轮是全中/补中/失误时的最优解。
时间复杂度$O(n^5)$,常数很小。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=53;
int n,flag,i,j,_,ca,cb,cc,cd,ans,f[N][N][N][N][2][3];
struct P{int x,y,z;}a[N],b[N],c[N],d,_c[N];
inline bool cmpx(const P&a,const P&b){return a.x>b.x;}
inline bool cmpz(const P&a,const P&b){return a.z>b.z;}
inline void up(int&a,int b){a<b?(a=b):0;}
void solve(){
int i,j,r,k,S,o,w,v,t,x,y,cana,cane;
for(i=0;i<=ca;i++)for(j=0;j<=cb;j++)for(r=cb;r>=j;r--)for(k=0;k<=cc;k++)for(S=0;S<=cd;S++)for(o=0;o<3;o++)f[i][j][r][k][S][o]=-1;
f[0][0][cb][0][0][0]=0;
for(i=0;i<=ca;i++)for(j=0;j<=cb;j++)for(r=cb;r>=j;r--)for(k=0;k<=cc;k++)for(S=0;S<=cd;S++)for(o=0;o<3;o++){
w=f[i][j][r][k][S][o];
if(w<0)continue;
cana=cane=1;
if(i+j+cb-r+k+S+1==n-1)cana=flag,cane=flag^1;
if(cana&&i<ca){
t=10;
if(o)t<<=1;
up(f[i+1][j][r][k][S][1],w+t);
}
if(!cane)continue;
if(j<r){
x=b[j+1].x,y=b[j+1].y;
t=x+y;
if(o==1)t=(x+y)<<1;
if(o==2)t=(x<<1)+y;
up(f[i][j+1][r][k][S][2],w+t);
x=b[r].x,y=b[r].y;
t=x+y;
if(o==1)t=(x+y)<<1;
if(o==2)t=(x<<1)+y;
up(f[i][j][r-1][k][S][2],w+t);
}
if(k<cc){
x=c[k+1].x,y=c[k+1].y;
t=x+y;
if(o==1)t=(x+y)<<1;
if(o==2)t=(x<<1)+y;
up(f[i][j][r][k+1][S][0],w+t);
}
if(S<cd){
x=d.x,y=d.y;
t=x+y;
if(o==1)t=(x+y)<<1;
if(o==2)t=(x<<1)+y;
up(f[i][j][r][k][1][0],w+t);
}
}
for(j=0;j<=cb;j++)for(o=0;o<3;o++)up(ans,f[ca][j][j][cc][cd][o]);
}
void cal(){
sort(c+1,c+cc+1,cmpz);
solve();
sort(c+1,c+cc+1,cmpx);
solve();
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].z=a[i].x+a[i].y;
}
if(a[n].x==10){
n++;
flag=1;
scanf("%d%d",&a[n].x,&a[n].y);
a[n].z=a[n].x+a[n].y;
}
for(i=1;i<=n;i++){
if(a[i].x==10){ca++;continue;}
if(a[i].z==10){b[++cb]=a[i];continue;}
c[++cc]=a[i];
}
sort(b+1,b+cb+1,cmpx);
cal();
for(i=1;i<=cc;i++){
cd=1,d=c[i];
for(j=1;j<=cc;j++)_c[j]=c[j];
for(_=0,j=1;j<=cc;j++)if(j!=i)c[++_]=c[j];
cc=_;
cal();
for(cc++,j=1;j<=cc;j++)c[j]=_c[j];
}
return printf("%d",ans),0;
}
BZOJ3877 : [Ahoi2014&Jsoi2014]保龄球的更多相关文章
- [AHOI2014/JSOI2014] 解题报告
[AHOI2014/JSOI2014] 奇怪的计算器 一个很关键的结论,任何时候每个数的相对大小是不变的. 于是可以把这个相对大小当成线段树的权值,每次只需要维护一下区间极值和tag就好了,关于操作四 ...
- 【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏 SPFA优化DP
[BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的 ...
- BZOJ3878: [Ahoi2014&Jsoi2014]奇怪的计算器
BZOJ3878: [Ahoi2014&Jsoi2014]奇怪的计算器 Description [故事背景] JYY有个奇怪的计算器,有一天这个计算器坏了,JYY希望你能帮助他写 一个程序来模 ...
- [luogu] P4040 [AHOI2014/JSOI2014]宅男计划(贪心)
P4040 [AHOI2014/JSOI2014]宅男计划 题目背景 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY不得不依靠叫外卖来维持生计. 题目描述 外卖店一共有N种食物, ...
- Bzoj 3874: [Ahoi2014&Jsoi2014]宅男计划 三分+贪心
3874: [Ahoi2014&Jsoi2014]宅男计划 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 861 Solved: 336[Su ...
- 「AHOI2014/JSOI2014」宅男计划
「AHOI2014/JSOI2014」宅男计划 传送门 我们首先要发现一个性质:存货天数随买食物的次数的变化类似于单峰函数. 具体证明不会啊,好像是二分加三分来证明?但是没有找到明确的严格证明. 感性 ...
- 「AHOI2014/JSOI2014」拼图
「AHOI2014/JSOI2014」拼图 传送门 看到 \(n \times m \le 10^5\) ,考虑根号分治. 对于 \(n < m\) 的情况,我们可以枚举最终矩形的上下边界 \( ...
- 「AHOI2014/JSOI2014」奇怪的计算器
「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...
- 「AHOI2014/JSOI2014」骑士游戏
「AHOI2014/JSOI2014」骑士游戏 传送门 考虑 \(\text{DP}\). 设 \(dp_i\) 表示灭种(雾)一只编号为 \(i\) 的怪物的代价. 那么转移显然是: \[dp_i ...
随机推荐
- Linux系统下目录的权限意义
访问者及其基本权限 Linux系统内的文件访问者有三种身份,分别是: a) 文件和文件目录的所有者: u---User(所有权);b) 文件和文件目录的所有者所在的组的用户: g---Group;c) ...
- Python Day-1 练习
作业1 要求:1.输入用户密码 2.认真成功后显示欢迎信息 3.输入三次锁定 代码如下: __author__ = 'zhang.ning' username = "zhangning&qu ...
- Linux(centos)系统各个目录的作用详解 推荐
文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等,可用cat ...
- 一脸懵逼加从入门到绝望学习hadoop之 org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=Administrator, access=WRITE, inode="/":root:supergroup:drwxr-xr报错
1:初学hadoop遇到各种错误,这里贴一下,方便以后脑补吧,报错如下: 主要是在window环境下面搞hadoop,而hadoop部署在linux操作系统上面:出现这个错误是权限的问题,操作hado ...
- jQuery实用工具集
插件描述:jQuery实用工具集,该插件封装了常用功能,如序列化表单值获取地址栏参数window对象操作等 此工具集包含判断浏览器,判断浏览终端,获取地址栏参数,获取随机数,数据校验等常用操作功能 引 ...
- MyEclipse和tomcat结合编写jsp对于中文乱码的解决方法
一.Java和jsp 中文乱码原因和解决方法: Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦.原因有两方面: 第一方面:J ...
- 解决 js setTimeout 传递带参数的函数无效果
最近 js 用到 setTimeout 递归调用 刷新进度 setTimeout ("getProgress(name,type)", 3000) ; 发现getProgres ...
- BZOJ2219 数论之神 数论 中国剩余定理 原根 BSGS
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2219.html 题目传送门 - BZOJ2219 题意 求同余方程 $x^A\equiv B \pmo ...
- sqlldr的使用
1,在公司进行预处理的时候,发现文件不能入库,而公司前辈使用的是sqlldr的技术将解析后的文件入库,前辈在测试的时候使用的是本机上的数据库(见图一),没有使用完整的远程连接oracle的正确方式,所 ...
- fastAdmin进阶
基本知识流程一栏链接 bootstrapTable fastadmin系统配置(符内置规则): fastadmin默认的controller已实现的方法 一张图解析fastadmin的表格: fast ...