业余acmer笔记·4月第2周补题

Rotate Columns (hard version)

原题地址
在这里插入图片描述
在这里插入图片描述
代码:
懒得翻译了,题目很好懂
刚看时没思路,但看了题解就感觉没啥意思了,一道标准的状压DP(还是自己太菜了)
代码来源

const int N=13;
const int M=2005;
int n,m,B[M],C[M],A[N][M];
int f[N+1][1<<N],g[N+1][1<<N];
bool cmp(int a,int b) {return B[a]>B[b];}//B[i]代表第i列的最大值
int main( )
{
  int i,j,k,t,z,r,u,G,T=read( );
  while(T--)
    {
      	read(n);read(m);;
      	for(i=1;i<=m;i++) B[i]=0,C[i]=i;
      	for(i=1;i<=n;i++)
			for(j=1;j<=m;j++)
	 		 A[i][j]=read( ),B[j]=max(B[j],A[i][j]);
      	sort(C+1,C+m+1,cmp);
      	int S=(1<<n)-1,o=min(n,m);
      	for(i=1;i<=o;i++)
		{
	  		k=C[i];
	  		for(j=0;j<=S;j++)
	   		{
	      		u=0;
	      		for(t=0;t<n;t++)//t代表转几格
				{
		  			r=0;
		  			for(z=1;z<=n;z++)//z遍历各个位置
		   			{
		      			G=((z-1)+t)%n+1;
		      			if((1<<(G-1))&j) r+=A[z][k];
		    		}
		  			u=max(u,r);
				}
	      		g[i][j]=u;//g[i][j]代表第i列状态为j的最大值
	    	}
		}
      	for(i=1;i<=o;i++)
	  		for(j=0;j<=S;j++)
	    		for(f[i][j]=g[i][j],k=j;k;k=(k-1)&j)
	    		//注意这层for循环,第一次见这个写法,目的是求出小于j且k&j!=0的数
	      			f[i][j]=max(f[i][j],f[i-1][k]+g[i][j-k]);
	    //f[i][j]代表前i列状态为j时的最大值
      	printf("%d\n",f[o][S]);
    }		  	      
  	return 0;
}

Large Triangle

原题地址
在这里插入图片描述
在这里插入图片描述
题目大意:给n(n<=2000)个点,问你是否存在一个三角形,面积为k,有则输出任意符合条件的三角形顶点

代码:
参考博客

和BZOJ 3707差不多,只不过原题是求最小三角形面积
BZOJ 3707题解

讲一下为什么可以以x作为排序依据
在这里插入图片描述
在这里插入图片描述
总结就是,想出这个优化的人tql

E. Divisor Paths

原题地址

参考博客

其实看了参考博客的分析后,感觉并不难想,但比赛时做完D还有半小时,结果一点思路也没有(也有当时想睡觉的原因)

纪念一下,时隔两个月,cf div2场再次A掉4题
虽然从去年这个时候开始,div2已经基本保证个人3题起步,但A掉D题还是非常难见的事,也有各种原因(想的太复杂,敲错了某个字母检查不出来),但根本原因还是菜。毕竟学校的紫名大佬也能场场A掉3题(div1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值