首页 > 其他分享 >【dp】【进制】P3464 [POI2007] WAG-Quaternary Balance 题解

【dp】【进制】P3464 [POI2007] WAG-Quaternary Balance 题解

时间:2023-10-18 09:22:19浏览次数:34  
标签:cnt 进制 WAG 题解 POI2007 len int P3464 mod

P3464

显然的,先将原数变为四进制的数。

由于算的是进位/不进位的代价最小值和方案数,容易想到 dp。

这里假定该四进制数是从高位到低位的,顺序显然是由低位到高位。

令 \(f_{i,0/1}\) 表示第 \(i\) 位进 / 不进位的最小代价,\(g_{i,0/1}\) 表示的是最小代价下的方案数。

转移是简单的,对当前位的值分讨一下即可。

时空复杂度线性。

代码:

const int N=1e3+10,mod=1e9;
int n,cnt;
int a[N<<2],b[N],temp[N];
int f[N<<2][2],g[N<<2][2];
string s;

int main(){
	cin>>s;
	int n=s.size();
	s=" "+s;
	int len=n;
	for(int i=1;i<=len;i++)
		b[i]=s[i]-'0';
	while(1){
		for(int i=1;i<=len;i++)
			temp[i]=b[i];
		int now=0,lt=0;
		for(int i=1;i<=len;i++){
			now=now*10+temp[i];
			if(lt||now>=4)
				b[++lt]=now/4;
			now%=4;
		}
		a[++cnt]=now;
		len=lt;
		if(!len)
			break;
	}
	reverse(a+1,a+cnt+1);
	f[cnt][0]=a[cnt],f[cnt][1]=4-a[cnt];
	g[cnt][0]=g[cnt][1]=1;
	for(int i=cnt-1;i;i--){
		if(a[i]==3){
			f[i][0]=a[i]+f[i+1][0];
			g[i][0]=g[i+1][0];
			if(f[i+1][0]+1<=f[i+1][1]){
				f[i][1]=f[i+1][0]+1;
				g[i][1]=g[i+1][0];
			}
			if(f[i+1][0]+1>=f[i+1][1]){
				f[i][1]=f[i+1][1];
				g[i][1]=(g[i][1]+g[i+1][1])%mod;
			}
		}else{
			if(f[i+1][1]+1<=f[i+1][0]){
				f[i][0]=a[i]+f[i+1][1]+1;
				g[i][0]=g[i+1][1];
			}
			if(f[i+1][1]+1>=f[i+1][0]){
				f[i][0]=a[i]+f[i+1][0];
				g[i][0]=(g[i][0]+g[i+1][0])%mod;
			}
			if(f[i+1][0]+4-a[i]<=f[i+1][1]+3-a[i]){
				f[i][1]=f[i+1][0]+4-a[i];
				g[i][1]=g[i+1][0];
			}
			if(f[i+1][0]+4-a[i]>=f[i+1][1]+3-a[i]){
				f[i][1]=f[i+1][1]+3-a[i];
				g[i][1]=(g[i][1]+g[i+1][1])%mod;
			}
		}
	}
	if(f[1][0]<f[1][1]+1)
		cout<<g[1][0]<<endl;
	else if(f[1][0]>f[1][1]+1)
		cout<<g[1][1]<<endl;
	else
		cout<<(g[1][0]+g[1][1])%mod<<endl;
	return 0;
}

标签:cnt,进制,WAG,题解,POI2007,len,int,P3464,mod
From: https://www.cnblogs.com/Pengzt/p/17771274.html

相关文章

  • [题解] CF1790E - XOR Tree
    CF1790E-XORTree题意给定一颗无根树,在可以改变任意一个点的点权操作基础上,让树上任意简单路径的异或和不为\(0\),问最少需要多少次操作。思路假设某个点为根,设\(pre_x\)为\(x\)点到根的树上前缀异或和,\(a_x\)为\(x\)的点权,则\(x\)和\(y\)之间简单路径的异或和......
  • [题解]CF514D R2D2 and Droid Army
    思路首先,可以转化题意,找到一个极长的区间\([l,r]\)使得(其中\(mx_i\)表示\([l,r]\)区间中属性\(i\)的最大值):\[\sum_{i=1}^{m}mx_i\leqk\]显然对于这个东西当\(l,r\)发生移动时,是极其好维护的,所以想到双指针。因为\(m\leq5\),所以我们可以直接开\(m\)个ST表......
  • 题解——2023年码谷提高组模拟赛1016
    题解——2023年码谷提高组模拟赛1016一套被各种转来转去的题;参考:https://blog.csdn.net/liuziha/article/details/127353981、https://www.luogu.com.cn/blog/Chen5201314/xiao-nei-bi-sai-1025-zong-jie-ti-xie和https://www.cnblogs.com/Clyfort/articles/0927-test-solutio......
  • 「BZOJ2505」tickets 题解
    preface网上目前还没看到我的方法,就大概讲一下做法solution首先想到贪心,考虑\([l,r]\)的最大次数,一定是找到最小的\(x\)满足\(l\simx\)的位数的和大于等于\(k\),然后递归的求解\([x+1,r]\),易证。还是考虑将\(Query(l,r)\)拆分成\(Query(1,r)\)和\(Query......
  • RTMP dimensions not set问题解决方案
    问题RTMP开始推流,打印错误提示:dimensionsnotset源码位置libavformat\mux.ccaseAVMEDIA_TYPE_VIDEO:if((par->width<=0||par->height<=0)&&!(of->flags&AVFMT_NODIMENSIONS)){av_log(s,A......
  • ABP中关于Swagger的一些配置
    Abp集成Swagger官方文档,请参考SwaggerIntegrationAspNetCore配置Swagger,请参考Swashbuckle.AspNetCore本文的项目环境是AspNetCore6.0+Volo.Abp.Swashbuckle6.0.2Abp中默认的基础配置如下:publicoverridevoidConfigureServices(ServiceConfigurati......
  • CF1879F Last Man Standing 题解
    原题翻译观察题目,容易发现当题目难度为\(x\)时一个OIer存活时间为\(h_i\lceil\frac{a_i}{x}\rceil\)发现\(a_i\)较小,所以我们先考虑暴力枚举\(x\in[1,\maxa_i]\),然后把原数组按\(a_i\)排个序,对于每组\(\lceil\frac{a_i}{x}\rceil\)相同的部分统一计算他......
  • visual studio智能提示出现慢的问题解决办法
    VisualStudio智能提示出现慢的问题解决办法如下:清理VisualStudio缓存。通过"文件"→"打开文件或项目"→"取消"→"是,清理所有项目"进行清理。清理VisualStudio实例。通过"文件"→"关闭解决方案"进行清理。重置用户数据。打开VisualStudio的开发人员命令提示符,输入devenv.ex......
  • CF1680F Lenient Vertex Cover 题解
    CF1680FLenientVertexCover题解这道题和「JOISC2014Day3」电压非常类似,或者说就是一道题。题意就是给你一个图,问能否对所有点黑白染色,允许最多一条边的两个顶点都染成黑色。黑白染色后其实就是一个二分图,那如果有一条边的两个顶点染成黑色,就是说去掉该边后,剩下的图为二分......
  • 题解:CF237D
    题目传送门思路构造\(k\)个集合,使这些集合满足以下性质:集合的并集为\(V\)。对于树\(s\)中的任意一条边\((a,b)\),都能在\(k\)个集合中找到一个集合\(x\)使得\(a,b\inx\)。对于树\(s\)中的任意一个点\(a\),所有在\(k\)个集合中包含了\(a\)的集合构成了......