首页 > 其他分享 >CF练习题17(DP)

CF练习题17(DP)

时间:2023-11-01 11:33:15浏览次数:35  
标签:练习题 int sum CF read DP

Chocolate Bar

我们看到 \(n,m\le 30\) 想到暴搜。

考虑枚举分割线,一直到刚好满足需要或者只有一个巧克力的情况。

随手跑了个最优解。

inline int dfs(int n,int m,int k){
	if(n*m==k)return 0;
	if(k<=0)return 0;
	if(f[n][m][k]<inf)return f[n][m][k];
	int res=inf;
	up(i,1,m){
		if(m-i<=0)break;
		res=min(res,dfs(n,i,min(i*n,k))+dfs(n,m-i,max(k-i*n,0))+n*n);
	}
	up(i,1,n){
		if(n-i<=0)break;
		res=min(res,dfs(i,m,min(i*m,k))+dfs(n-i,m,max(k-i*m,0))+m*m);
	}
	return f[n][m][k]=res;
}
int n,m,k;
signed main() {
	T=read();
	memset(f,0x3f,sizeof f);
	while(T--){
		n=read();m=read();k=read();
		write(dfs(n,m,k),1);
	}
	return 0;
}

Hard Process

显然,答案具有单调性,所以可以考虑直接二分。

int n,k,sum[N],a[N];
int ans=0,p=0;
signed main(){
    n=read();k=read();
    up(i,1,n){
        a[i]=read();
        sum[i]=sum[i-1]+(a[i]==0);
    }
    up(i,1,n){
        int l=i,r=n,maxl=0;
        while(l<=r){
            int mid=(l+r)>>1;
            if(sum[mid]-sum[i-1]<=k){
                l=mid+1;
                maxl=mid-i+1;
            }
            else r=mid-1;
        }
        if(ans<maxl)ans=maxl,p=i;
    }
    write(ans,1);
    up(i,1,n){
        if(i>=p&&i<=p+ans-1)write(1,0);
        else write(a[i],0);
    }
    return 0;
}

标签:练习题,int,sum,CF,read,DP
From: https://www.cnblogs.com/LiQXing/p/17802653.html

相关文章

  • CF1866G
    link每个车厢的人可以到的是一段区间。题面显然提示二分答案,二分答案\(x\),每个车厢可以承受\(x\)个人,考虑如何check每个人能否都能到一个区间。有一个比较显然的网络流来check的做法,原点向每个车厢连流量\(a_i\)的边,每个车厢向自己能到的区间连边,然后每个区间再向汇点......
  • CF1874F Jellyfish and OEIS 题解
    题目链接不明白出题人的脑回路是不是被宇宙射线改变过/jy。题目给出了若干个区间,要我们计算满足每个区间都不是对应下标的排列的数量,正着计算不满足要求的数量是困难的,我们将其容斥,转化为钦定一些区间要求其必须满足它是对应下标的排列,在下文中,我们称这样的区间为一个约束。我......
  • CF1454F
    linkSoltion:有一个比较显然的\(O(n^2)\)做法,枚举中间区间的左右端点,然后用前后缀\(\max\)和st表查询中间的\(\min\),其实不用st表也行,确定左端点枚举右端点的时候顺便求一下就好。考虑枚举左端点,以一个较快的方法求出右端点。发现后缀\(\max\)和确定左端点后的\(......
  • DP查缺补漏之01背包优化原理
    DP查缺补漏之01背包优化原理先复习一下基本知识状态假设DP[I][J]为前\(i\)个物品,容量小于\(j\)时的最优解(最大价值)状态转移DP[I][J]=max(DP[I-1][J],DP[I-1][J-V[I]]+W[I])对于第\(i\)个物品,两种可能装入背包则状态应通过前\(i-1\)个物品,容量小于\(j......
  • PoW、PoS、DPoS和PBFT简介
    1.概览PoW(工作量证明)、PoS(权益证明)、DPoS(委托权益证明)和PBFT(拜占庭容错)是区块链和分布式系统领域中常见的共识算法。下面将详细介绍这些共识算法的原理和特点:PoW(工作量证明):原理:PoW是比特币等区块链网络使用的共识算法。在PoW中,矿工通过解决一个数学难题(哈希碰撞)来创建新的区......
  • CF1451
    CF1451SubtractorDivide显然如果为偶数那么我们将它变到\(2\)再\(-1\)即可如果为奇数我们先\(-1\)再转化为偶数的情况即可对于\(n\le3\)进行特判#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#defineinlinline#defineebemplace_back......
  • CF600E Lomsat gelral
    树上启发式合并(dsuontree)通常用来查询不带修的子树信息,信息要求可合并。对于一个结点\(u\),其步骤如下:求解其轻儿子的答案,同时清除递归产生的影响。求解其重儿子的答案,保留递归产生的影响。将轻儿子子树内的每个结点都合并进答案中,同时成为以\(u\)为根的子树产生的影响。......
  • [CF576D] Flights for Regular Customers
    CF576D把矩阵定义为\(f_{t,i,j}\)表示恰好t步后i,j是否可达,则广义乘法为\[f_{t+1,i,j}=\sum_{k=1}^{n}f_{t,i,k}\wedgef_{1,k,j}\]因为是或操作,所以\(f_{i,j}=1\)时答案或上另一个乘数的第j行即可,bitset优化。从小到大扩展d,这时从恰好d步数可达的点bfs即......
  • CF708C Centroids
    对于一个不是重心的点\(u\),它必定有一棵子树\(T\)包含所有重心(如果有两个重心则它们必定相邻),显然\(|T|>\lfloor\frac{n}{2}\rfloor\),这阻碍了它成为重心。贪心地想,我们要在\(T\)中找出一棵子树\(S\)使得\(|S|\leq\lfloor\frac{n}{2}\rfloor\)且\(|S|\)尽可能大,然后将......
  • CF1764D Doremy's Pegging Game 组合数学
    CF1764DDoremy'sPeggingGame你怎么连简单题也不会?考虑满足条件当且仅当有连续的n/2向下取整段被删除。考虑最终状态一定是一次删除联通了两个连续段,然后结束。我们枚举这个连续段的长度i。最后一个删除的位置有n/2下取整*2-i种方案,设另外删除了j种,则另外删除的方案......