2020省选总结

省选总结:

第一天:

第一天犯了左倾错误。
第一题还没经过细想就判断为线段树上二分,完全没有想过正确性和更简单的写法。后来调不出来,考试时间所剩不多没有立即放弃去写后面的题的暴力,而是抱有侥幸心理。最后导致day1崩盘后面两题没有深入思考。

第一天第一题考场思路:

看完题目后我天真的认为答案应该是可选能量和较小的一组的能量和*2。写完后才发现过不了样例(这告诉我以后考试一定要先理解样例在写代码crying~~)。
于是我陷入了沉思,突然一个想法出现在我的脑中(万恶之源),一定有一组除了最后一个的能量没有消耗完以外其他的都消耗完了。我可不可以将每个点按排名排序,在以排序后的顺序建线段树呢?于是我在考场上写了一个200多行的代码,好不容易将能量调对了,温度却一直有问题。我为什么就想不到算出能量之后在算温度,非要一起算呢?(后悔)
于是我day1获得了一个惨不忍睹的分数。
考场上沉着冷静,讲究策略真的很重要。

第二天
第二天因为第一天考得不好失去了梦想。

第二天第一题思路:

2≤m≤23
这个数据范围考虑状态压缩dp。
设状态: f[i][j]
其中i表示选了几个信号站,j状态压缩记录每个信号站是否已经选了。
记传递序列中从i到j的次数为v[i][j]
不难看出:
f[i][j]=min{f[i-1][j|(1 << (a - 1))]+((j >>(p - 1)) & 1)?(v[p][a] * i + v[a][p]* i * k) : (v[p][a] * i * k - v[a][p] * i) }
(((j>>(a-1))&1) && a!=p)
其中i这一维并不影响所以时间复杂度为O( 2 m ∗ m 2 2^m*m^2 2mm2)
显然直接使用这个算法将得到30分的好成绩,所以要优化算法
可以预处理出sum[i][j]=((j >>(p - 1)) & 1)?(v[p][i] + v[i][p] * k) : (v[p][i] * k - v[i][p] )
其中i表示当前位新决定的信号塔,j状态压缩记录决定后每个信号站是否选了

 for(i=0;i<m;i++)
	        for(j=1;j<=m;j++)
	              sum1[i][0]+=v[j][i+1]*k-v[i+1][j];//当i在序列的第一个时所有其他的都在它之后
	   for(j=1;j<(1<<m);j++){
	        for(i=1;i<=m;i++)
			       if((j>>(i-1))&1){
				        flag=i;
						break;
				   }
			for(i=1;i<=m;i++)
			     if(!((j>>(i-1))&1)){
				       sum1[i-1][j]=sum1[i-1][j^(1<<(flag-1))]-(v[flag][i]-v[i][flag])*k+v[flag][i]+v[i][flag];//sum1[i-1][j]与sum1[i-1][j^(1<<(flag-1))]相比只有i与flag的顺序变化。
				 }
	  }

这样复杂度就为O( 2 m ∗ m 2^m*m 2mm)
可以得到60-80分
考后思考
因该可以用分块等方法进一步优化通过这道题,完成后更新
总结考试时应该将数组适当开大一点

第二天第二题:

我写的就是那个80分的写法,复杂度为O( n ∗ log ⁡ 2 2 n / 2 n*\log^2_2n/2 nlog22n/2)
计算一下 500000 ∗ 20 ∗ 20 / 2 = 100000000 500000*20*20/2=100000000 5000002020/2=100000000 瓶颈只有以个判断和赋值,有2000ms其实也没有那么假。也许可以水过呢

看到二进制考虑拆开每位单独计算。
未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值