1 条题解
-
0
何老师 (root) LV 0 MOD @ 2024-09-13 10:27:47
贪心
1、按重量由大到小排序,对于p[i].w(有p[i].a个),若有ret个塔的顶塔顶重量大于等于p[i].w+K,则尽量放多到塔顶(若你不放置,后面重量小的去放置,显然不划算),即个数为min(ret,p[i].a)。
2、设ret表示当前可放置塔,然后设一个大顶队来维护当前所有塔的数据:塔顶的重量和这种塔的数量,以重量为关键字。对于第i种重量的牛,其p[i].w,数量为p[i].a,先统计能放置他们的塔的数量ret,即累加大顶队中塔顶重量大于等于p[i].w+K的塔的数量,并把这些塔从大顶队中删除。然后得到一个新塔的塔顶重量为p[i].w,其数量为t=min(p[i].a,ret),把新塔数据{p[i].w,t} 加入大顶队,且ret减少t。时间复杂度O(NlogN)
3、进一步优化:可用一个数组q维护塔的数据,仔细分析,数组中塔顶重量会保持递减,因此设置两个下标指针x,y(x<y),q[x]..q[y-1]表示现有塔顶数据,累加可用塔数量数ret时,只需从q[x]开始扫描,直到x==y 或者 q[x].w<p[i].w+K,然后新塔(p[i].w,t)加入数组尾部q[y]即可。时间复杂度O(N)
- 1
信息
- ID
- 2935
- 难度
- 9
- 分类
- (无)
- 标签
- 递交数
- 6
- 已通过
- 1
- 通过率
- 17%
- 被复制
- 1
- 上传者