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数组记录这个状态的最优解是从哪个位置转移过来的。
#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的更多相关文章
- XJOI网上同步训练DAY5 T3
就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algori ...
- XJOI网上同步训练DAY1 T2
思路:似曾相识?...见http://www.cnblogs.com/qzqzgfy/p/5266874.html 一看时限还是4s!,于是就开开心心地打了70%的分,就是用容斥原理,就可以n^3解决 ...
- XJOI网上同步训练DAY1 T1
思路:我们考虑由于没有人的区间会覆盖其他人,所以我们将区间按左端点排序,发现如果地盘长度已知,可以贪心地尽量往左放,来判断是否有解,因此做法很简单,就是二分答案,然后O(n)贪心判定,复杂度为O(nl ...
- XJOI网上同步测试DAY14 T3
思路:tarjan把桥找出来,然后缩点,注意这里的缩点是:如果两个点之间的连边不是桥,那么就把他们缩起来,然后用一个lct维护,对于每个询问,如果官道连接的是两个联通块的话,就把他们连起来,否则我们就 ...
- XJOI网上同步训练DAY6 T2
思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath&g ...
- XJOI网上同步训练DAY6 T1
思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n ...
- XJOI网上同步训练DAY5 T1
思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...
- XJOI网上同步训练DAY3 T2
考试的时候已经想出来怎么做了,但是没有时间打了T_T 思路:我们考虑将询问以lim排序,然后树链剖分,把边作为线段树的节点,然后随着询问lim的增大,改变线段树中节点的信息,然后每次询问我们用树链剖分 ...
- XJOI网上同步训练DAY3 T1
思路:看来我真是思博了,这么简单的题目居然没想到,而且我对复杂度的判定也有点问题.. 首先我们选了一个位置i的b,那一定只对i和以后的位置造成改变,因此我们可以这样看: 我们从前往后选,发现一个位置的 ...
随机推荐
- DPI情况下处理
1. 字体不要跟着变大小,那就要使用setPixe,不要使用setPointSize 2. 图片可设置QPixmap::setDevicePixelRatio http://doc.qt.io/qt- ...
- Android获取当前时间与星期几
public class DataString { private static String mYear; private static String mMonth; private static ...
- (转载)tarjan求割点
割点是无向图中去掉后能把图割开的点.dfs时用dfn(u)记录u的访问时间,用low(u)数组记录u和u的子孙能追溯到的最早的节点(dfn值最小).由于无向图的dfs只有回边和树边,且以第一次dfs时 ...
- Bubble Sort 冒泡排序
//Bubble Sort ( O(n²)) public class TestBubbleSort { public int[] bubbleSortArray(int[] arr){ ; i &l ...
- c语言中break continue goto return和exit的区别 联系(筛选奇数和goto求和)
break 一般你是用于循环和switch语句中,执行break,退出循环,如果是多层循环,那么退出的当前的循环. 如果循环结构中有switch语句,而switch语句中有break 那么不会直接退出 ...
- WPF与输入法冲突研究之二:汉字输入法会导致WPF程序的崩溃!
如果是输入非汉字的数据信息,可以添加一下内容: xmlns:input="clr-namespace:System.Windows.Input;assembly=PresentationCo ...
- iOS开发:深入理解GCD 第一篇
最近把其他书籍都放下了,主要是在研究GCD.如果是为了工作,以我以前所学的GCD.NSOperation等知识已经足够用了,但学习并不仅仅知识满足于用它,要知其然.并且知其所以然,这样才可以不断的提高 ...
- Windows下文件列举,搜索
Windows下列举文件用的函数是 FindFirstFile 和 FindNextFile ,另外一个结构体是WIN32_FIND_DATA 以下是MSDN对于WIN32_FIND_DATA的定义 ...
- 使用RDS不得不知的注意事项
使用RDS不得不知的注意事项 1.RDS实例升级需要注意的事项 RDS在进行实例升级的过程中会出现最长30秒左右的连接闪断,需要您提前做好准备,并设置好程序跟RDS的自动重连,避免因为升级的闪断导致您 ...
- C# 对象深复制
Mark: //实现IClonable接口并重写Clone方法就可以实现深克隆了 #region ICloneable 成员 public object Clone() { MemoryStream ...