模拟赛day1 2014 10 25

本文深入探讨了算法、数据结构及其实现原理,包括排序、动态规划、哈希算法、贪心算法等核心概念,以及如何高效解决实际问题。
T1:
题目大意:有m道判断题,答案是'Y'或者'N',有n个人,每个人都给出了m个答案
再告诉你全对人p的和全错的人q的个数,求标准答案,如有多解,求字典序最小的,无解打-1
m<=500 n<=30000 0<=p  0<=q p+q<=n

这题还是比较水,就是细节比较多
先假设p!=0,这样就肯定有一个答案是标准答案,于是我们先把每个人的答案hash
再把他们的hash值排序,就可以枚举哪个是标准答案,如果其出现次数是p,就再求出它的全错的hash值,在判断是否为q就行了
当p=0,q!=0时把p与q swap一下,这样就只要求字典序最大的,最后输出时在反过来就行了 复杂度O(nlog2(n))
当p!=0,q!=0时,就代表没有一个是标准答案,也没有一个是全错方案,于是我们人的答案反过来加上去,就表示标准答案与那2*n个答案都不同
于是从全是N开始,在慢慢往上加就行了 复杂度O(nlog2(n))


T2:
题目大意:给你一个序列a[1]到a[n] n个数字,然后你要选出两个非空集合S和T
满足任意x属于S,y属于T,x<y 且
设s大小为p,t大小为q
a[s1] xor a[s2] xor a[s3] xor ... xor a[sp]==a[t1] and a[t2] and ... and a[tq]
求满足条件的(s,t)的个数
n<=1000,0<=a[i]<1024

这题解法很神,当时没想出来
两个数相等,可以看成xor起来等于0,所以题目转化为 a[s1] xor a[s2] xor ... xor a[sp] xor a[t1] and a[t2] and ... and a[tq]==0
所以有DP f[i][j][0]代表到了i,值为j,是and的方案数,f[i][j][1]代表到了i,值为j,是xor的方案数
就有转移 f[i][j][0]=f[i+1][j][0], f[i][a[i]&j][0]+=f[i+1][j][0]; f[i][j][1]=f[i+1][j][1],f[i][j^a[i]][1]+=f[i+1][j][0]+f[i+1][j][1];
初值为f[i][a[i]][0]=1;答案就是f[1][0][1];这题还要用到高精度,因为只有加法操作,所以可以压9位 复杂度O(n*1024*40) 40是高精度位数


T3:
题目大意:给你一个n个点m条带权双向边的可能有重边有自环的图,起点在1,问你可不可能在T时刻到达n号点  n<=50 m<=100 T<=1e18 边权<=10000

这题我只想出了O(mk)的做法,打了个30分的暴力


我们谁便找一条边,再将其边权乘以二,就是一个环长,设其为D
设dis[i][j]代表到达i好点,时间t满足t=j+pD   p属于非负整数 的最小的t

这个我们可以用spfa来处理 , 最后的答案就是dis[n][T%D]是否小于T 复杂度O(k*2*n*d*m) k为spfa常数,d为最小的边权,但是有用状态非常少,所以还是可以过的


测的时候第二题不知道哪里打挂了,连暴力分都没拿全,第一题写了拍完将近用了2h,第三题rp不是很好,随机的点一个都没过(经计算,有20%的几率是可以过点的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值