思路:一开始看到这题的时候想DP,可是发现貌似不行。。因为有前缀也有后缀,而且有的后缀会覆盖到现在的前缀,这就不满足无后效性了啊!

但是有个很巧妙的思路:如果我们知道a[i]的最大值,那么p的数量和q的数量也确定了。所以序列长度也确定了,设m为序列长度。

而且对于每个a[i]都代表了一个固定数量的p和q和长度。

因此,长度大于m/2的前缀,我们可以用总的p和总的q减去它,转换成小于等于m/2长度的前缀后缀。

这样我们可以设计DP为f[i][j][k],代表从左往右i个中有j个p,从右往左i个有k个p,这样f[(m+1)/2]的位置就是最终答案!

注意要记录一个pre数组记录这个状态的最优解是从哪个位置转移过来的。

 #include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#define ll long long
ll a[];
const ll PW=;
const ll QW=;
int c[][],n,pre[][][][],w[][],f[][][];
int ans[],cn;
int read(){
char ch=getchar();int t=,f=;
while (ch<''||''<ch){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void init(){
n=read();
for (int i=;i<n;i++){
double x;scanf("%lf",&x);
a[i]=(ll)(x*+0.5);
}
}
void solve(){
int mxpos=;
for (int i=;i<n;i++){
if (a[i]>a[mxpos]) mxpos=i;
}
int totp=-,totq=-;
for (int i=;(ll)i*PW<=a[mxpos];i++)
if ((a[mxpos]-(ll)i*PW)%QW==){
totp=i;
totq=(int)((a[mxpos]-(ll)i*PW)/QW);
break;
}
for (int i=;i<n;i++){
int p=-,q=-;
for (int j=;(ll)j*PW<=a[i];j++)
if ((a[i]-(ll)j*PW)%QW==){
p=j;
q=(int)((a[i]-(ll)j*PW)/QW);
break;
}
if (p!=-&&p+q<=totp+totq){
c[cn][]=p;
c[cn][]=q;
cn++;
}
}
int m=totp+totq;
for (int i=;i<cn;i++){
if (c[i][]+c[i][]<=m/){
w[c[i][]+c[i][]][c[i][]]++;
}else{
w[m-c[i][]-c[i][]][totq-c[i][]]++;
}
}
f[][][]=;
for (int i=;i<=m/;i++)
for (int j=;j<=i;j++)
for (int k=;k<=i;k++){
int s=-;
for (int p=;p<=;p++){
for (int q=;q<=;q++){
if (j-p>=&&j-p<i&&k-q>=&&k-q<i&&f[i-][j-p][k-q]>s){
s=f[i-][j-p][k-q];
pre[i][j][k][]=p;
pre[i][j][k][]=q;
}
}
}
f[i][j][k]=s+w[i][j]+((k==j)?:w[i][k]);
}
int ansi=-,ansj=-,ansk=-;
for (int k=;k<=m%;k++)
for (int i=;i<=m/;i++){
int j=totq-k-i;
if (j>=&&j<=m/&&(ansi==-||f[m/][i][j]>f[m/][ansi][ansj])){
ansi=i;
ansj=j;
ansk=k;
}
}
if (m%) ans[m/]=ansk;
for (int i=m/;i>;i--){
int p=pre[i][ansi][ansj][];
int q=pre[i][ansi][ansj][];
ans[i-]=p;
ans[m-i]=q;
ansi-=p;
ansj-=q;
}
for (int i=;i<m;i++)
if (ans[i]) printf("Q");
else printf("P");
}
int main(){
init();
solve();
}

XJOI网上同步训练DAY1 T3的更多相关文章

  1. XJOI网上同步训练DAY5 T3

    就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algori ...

  2. XJOI网上同步训练DAY1 T2

    思路:似曾相识?...见http://www.cnblogs.com/qzqzgfy/p/5266874.html 一看时限还是4s!,于是就开开心心地打了70%的分,就是用容斥原理,就可以n^3解决 ...

  3. XJOI网上同步训练DAY1 T1

    思路:我们考虑由于没有人的区间会覆盖其他人,所以我们将区间按左端点排序,发现如果地盘长度已知,可以贪心地尽量往左放,来判断是否有解,因此做法很简单,就是二分答案,然后O(n)贪心判定,复杂度为O(nl ...

  4. XJOI网上同步测试DAY14 T3

    思路:tarjan把桥找出来,然后缩点,注意这里的缩点是:如果两个点之间的连边不是桥,那么就把他们缩起来,然后用一个lct维护,对于每个询问,如果官道连接的是两个联通块的话,就把他们连起来,否则我们就 ...

  5. XJOI网上同步训练DAY6 T2

    思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath&g ...

  6. XJOI网上同步训练DAY6 T1

    思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n ...

  7. XJOI网上同步训练DAY5 T1

    思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...

  8. XJOI网上同步训练DAY3 T2

    考试的时候已经想出来怎么做了,但是没有时间打了T_T 思路:我们考虑将询问以lim排序,然后树链剖分,把边作为线段树的节点,然后随着询问lim的增大,改变线段树中节点的信息,然后每次询问我们用树链剖分 ...

  9. XJOI网上同步训练DAY3 T1

    思路:看来我真是思博了,这么简单的题目居然没想到,而且我对复杂度的判定也有点问题.. 首先我们选了一个位置i的b,那一定只对i和以后的位置造成改变,因此我们可以这样看: 我们从前往后选,发现一个位置的 ...

随机推荐

  1. hdu 找新朋友

    #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ]; ...

  2. JavsScript的基本特点

    1.简单性Javascript是一种脚本语言,它采用小程序段的方式实现编程它同样也是一种解释性语言.2.动态性Javascript是动态的,它可以直接对用户或者客户输入做出相应,无须经过Web服务程序 ...

  3. 关于IoCallDriver

    通常我们所知IoCallDriver是把irp传递给下一层设备,传递到底是什么意思呢?IoCallDriver中实际调用了IopfCallDriver,其代码如下:NTSTATUSFORCEINLIN ...

  4. BZOJ1270: [BeijingWc2008]雷涛的小猫

    1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 836  Solved: 392[Submit][ ...

  5. bzoj1786

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1786 刚看上去觉得挺吓人的...... 冥冥之中我的内心深处告诉我填进去的数一定是非严格递增的 ...

  6. SQLServer 安装以前的某个程序安装已在安装计算机上创建挂起的文件操作 解决办法

    http://wenku.baidu.com/view/6732fe09844769eae009ede2.html SQL Server 安装以前的某个程序安装已在安装计算机上创建挂起的文件操作 安装 ...

  7. Install and configure sql server 2008 express

    http://www.symantec.com/connect/articles/install-and-configure-sql-server-2008-express

  8. USB Video Class及其实现

    1 Video Class 基础概念Usb协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容.这些Class ...

  9. 使用PHPExcel导入导出excel格式文件

    使用PHPExcel导入导出excel格式文件  作者:zccst  因为导出使用较多,以下是导出实现过程.  第一步,将PHPExcel的源码拷贝到项目的lib下  文件包含:PHPExcel.ph ...

  10. 如何单独编译Android源代码中的模块

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6566662 第一次下载好Android源代码工 ...