2016.8.10测试总结

第一题:
题意:平面上有N条直线,用方程Ax+By+C=0表示。这些直线没有三线共点的,要求计算出用这些直线可以构造出多少三角形?(1 ≤ N≤ 300000,直线方程的系数不超过10^9。)

分析:
计算斜率K=-A/B,只要斜率不同则会相交。三条能两两相交的直线,就能构成一个三角形。
一共有三种情况:
1、两条平行直线+一条斜率不同的直线:k1
2、三条平行直线:k2
3、三条不同直线:k3
所有情况 k总=C(3,n) 组合数
显然 k总=k1+k2+k3 (k3即为答案)

第二题:
题意:编号为1-n、一共n种物品,价格分别为c1、c2…cn。有m种合成物品的方式(ai,xi,yi),表示yi与xi可以合成ai,其中三个物品各不相同。求得到物品1的最小花费。(0<=ci<=10^9,n<=10000,m<=100000)

分析:
转化为最短路问题。每种合成方式为一条边,通过松弛操作更新物品的最低花费。方法:从一开始就需要更新的物品开始,做最短路。

第三题:
题意:给出N个字符串,分别求出num数组。要求输出(num[i]+1)的乘积,对 1,000,000,007 取模。(n ≤ 5, Len ≤ 1,000,000)
num[i]表示对于字符串S的前i 个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠的字符串数量。例如S=”aaaa” num[]={0,1,1,2}

分析:
用扩展KMP,得出每一个后缀与本串的最多匹配next[i]。如果next[i]>=i,则有重叠,此时只能取next[i]=i。显然,字符串最远位置R=next[i]+i-1,最近L=i。区间(L,R)里的num[i]值都加1。
如何快速实现+1操作?在a[L]+1 a[R+1]-1。a[1]+a[2]…+a[i]=num[i]

第四题:
题意:G个女孩,B个男孩,P个宠物。FreeOpen系统认为,如果一个女孩和一个男孩彼此喜欢,当他们与他们喜欢同样的宠物生活在一起他们会很高兴。系统想知道最大匹配。每个匹配由一个女孩,一个男孩和一个宠物,并且每一个女孩,男孩和宠物只能在一个匹配中。(0 < G,B,P <= 20 ,0 < G+B+P <= 60)

分析:
网络流:由于数据规模比较小,先通过搜索匹配男孩和女孩,将其合并。再用网络流将合并点与宠物匹配。
构图如图:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值