当前位置: 首页 > news >正文

XJOI网上同步训练DAY1 T3

思路:一开始看到这题的时候想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数组记录这个状态的最优解是从哪个位置转移过来的。

  1 #include<algorithm>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<iostream>
  6 #define ll long long
  7 ll a[200005];
  8 const ll PW=9705276;
  9 const ll QW=12805858;
 10 int c[200005][2],n,pre[205][205][205][2],w[205][205],f[205][205][205];
 11 int ans[200005],cn;
 12 int read(){
 13     char ch=getchar();int t=0,f=1;
 14     while (ch<'0'||'9'<ch){if (ch=='-') f=-1;ch=getchar();}
 15     while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
 16     return t*f;
 17 }
 18 void init(){
 19     n=read();
 20     for (int i=0;i<n;i++){
 21         double x;scanf("%lf",&x);
 22         a[i]=(ll)(x*100000+0.5);
 23     }
 24 }
 25 void solve(){
 26     int mxpos=0;
 27     for (int i=1;i<n;i++){
 28         if (a[i]>a[mxpos]) mxpos=i;
 29     }
 30     int totp=-1,totq=-1;
 31     for (int i=0;(ll)i*PW<=a[mxpos];i++)
 32      if ((a[mxpos]-(ll)i*PW)%QW==0){
 33             totp=i;
 34             totq=(int)((a[mxpos]-(ll)i*PW)/QW);
 35             break;
 36     }
 37     for (int i=0;i<n;i++){
 38         int p=-1,q=-1;
 39         for (int j=0;(ll)j*PW<=a[i];j++)
 40          if ((a[i]-(ll)j*PW)%QW==0){
 41                 p=j;
 42                 q=(int)((a[i]-(ll)j*PW)/QW);
 43                 break;
 44          }
 45          if (p!=-1&&p+q<=totp+totq){
 46                 c[cn][0]=p;
 47                 c[cn][1]=q;
 48                 cn++;
 49          }
 50     }
 51     int m=totp+totq;
 52     for (int i=0;i<cn;i++){
 53         if (c[i][0]+c[i][1]<=m/2){
 54             w[c[i][0]+c[i][1]][c[i][1]]++;
 55         }else{
 56             w[m-c[i][0]-c[i][1]][totq-c[i][1]]++;
 57         }
 58     }
 59     f[0][0][0]=0;
 60     for (int i=1;i<=m/2;i++)
 61      for (int j=0;j<=i;j++)
 62       for (int k=0;k<=i;k++){
 63             int s=-1;
 64             for (int p=0;p<=1;p++){
 65                 for (int q=0;q<=1;q++){
 66                     if (j-p>=0&&j-p<i&&k-q>=0&&k-q<i&&f[i-1][j-p][k-q]>s){
 67                         s=f[i-1][j-p][k-q];
 68                         pre[i][j][k][0]=p;
 69                         pre[i][j][k][1]=q;
 70                     }
 71                 }
 72             }
 73             f[i][j][k]=s+w[i][j]+((k==j)?0:w[i][k]);
 74       }
 75     int ansi=-1,ansj=-1,ansk=-1;
 76     for (int k=0;k<=m%2;k++)
 77      for (int i=0;i<=m/2;i++){
 78         int j=totq-k-i;
 79         if (j>=0&&j<=m/2&&(ansi==-1||f[m/2][i][j]>f[m/2][ansi][ansj])){
 80             ansi=i;
 81             ansj=j;
 82             ansk=k;
 83         }
 84     }
 85     if (m%2) ans[m/2]=ansk;
 86     for (int i=m/2;i>0;i--){
 87         int p=pre[i][ansi][ansj][0];
 88         int q=pre[i][ansi][ansj][1];
 89         ans[i-1]=p;
 90         ans[m-i]=q;
 91         ansi-=p;
 92         ansj-=q;
 93     }
 94     for (int i=0;i<m;i++)
 95      if (ans[i]) printf("Q");
 96      else printf("P");
 97 }
 98 int main(){
 99     init();
100     solve();
101 }

 

转载于:https://www.cnblogs.com/qzqzgfy/p/5615145.html

相关文章:

  • 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
  • phpStorm设置显示代码行号
  • 【DAY1】Linux的安装和基本命令学习笔记
  • ASP.net Membership角色与权限管理(二)
  • XML和HTML之间的差异
  • 互联网时代程序员如何避免知识半衰期?
  • MarkDown 语法
  • LAMP--Apache 不记录指定文件类型的日志
  • linux diff命令
  • sql linq lamda
  • 存储过程的输出参数为游标,PL/SQL中如何调用 Java代码如何调用
  • 第2周
  • Navicat for MySQL连接MYSQL出错,相关原因及解决方案
  • Apache Rewrite url重定向功能的简单配置
  • AJAX实现文件下载
  • 2019.2.20 c++ 知识梳理
  • CentOS 7 防火墙操作
  • github从入门到放弃(1)
  • HTTP 简介
  • Laravel Mix运行时关于es2015报错解决方案
  • mac修复ab及siege安装
  • overflow: hidden IE7无效
  • python 装饰器(一)
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 产品三维模型在线预览
  • 从0到1:PostCSS 插件开发最佳实践
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用 QuickBI 搭建酷炫可视化分析
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ionic异常记录
  • ​【已解决】npm install​卡主不动的情况
  • ​queue --- 一个同步的队列类​
  • #100天计划# 2013年9月29日
  • #DBA杂记1
  • #define,static,const,三种常量的区别
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $.ajax,axios,fetch三种ajax请求的区别
  • (007)XHTML文档之标题——h1~h6
  • (39)STM32——FLASH闪存
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一)appium-desktop定位元素原理
  • ..回顾17,展望18
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 常见的偏门问题
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET中两种OCR方式对比
  • .php文件都打不开,打不开php文件怎么办
  • .so文件(linux系统)
  • @EnableConfigurationProperties注解使用
  • []FET-430SIM508 研究日志 11.3.31
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [AutoSAR 存储] 汽车智能座舱的存储需求