Wannafly挑战赛13 D 思维 E 线段树

D applese的生日

题目描述

最可爱的applese生日啦,他准备了许多个质量不同的蛋糕,想请一些同学来参加他的派对为他庆生,为了不让一部分同学感到不爽,他决定把每个蛋糕都分割成几份(也可以不分割),使得最小的蛋糕的质量与最大的蛋糕的质量的比值不小于一个值。但是applese的刀功并不是很好,所以他希望切尽量少的刀数使得所得到的蛋糕满足条件。由于applese为了保证每一块蛋糕的质量和期望的没有偏差,所以他一刀只能切下一块蛋糕,即将一块蛋糕分成两块,同时,他不能一刀同时切两块蛋糕,也就是说,applese一次只能将一块蛋糕分割成两块指定质量的蛋糕,这两块蛋糕的质量和应等于切割前的蛋糕的质量。Applese还急着准备各种派对用的饰品呢,于是他把这个问题交给了你,请你告诉他至少要切割几次蛋糕
输入描述:

第一行包括两个数T,n,表示有n个蛋糕,最小的蛋糕的质量与最大的蛋糕的质量的比值不小于T
接下来n行,每行一个数wi,表示n个蛋糕的质量

输出描述:

输出包括一行,为最小切割的刀数
数据保证切割次数不超过500

示例1
输入

0.99 3
2000 3000 4000

输出

6

备注:

0.5 < T < 1
1 <= n <= 1000
1 <= wi <= 1000000

官方题解:
首先有一个结论:每块蛋糕分成的每一块的大小是相同的。
基于这个结论,每次找到当前划分最大块所在的大块并将其划分数+1,检查是否满足题目的要求。
考虑这个结论为什么是正确的:
考虑一个蛋糕切的刀数不变,那么可以想到假如分割得到的块是不同的,那么可能的贡献是增加最大和最小之间的差值,那么这样答案只会更劣,所以可以想到分成的每个块的大小是相同的。那么只要按照上面模拟就可以了,这题妥妥的送温暖题啊。
tags:
感觉好玄学的一道题。。。首先这个结论要想到,想不到也要猜到=_= 然后就是优先队列模拟一下就好了。
代码:https://paste.ubuntu.com/p/jTtKwJJsSH/

E VVQ 与线段

题目描述
VVQ 最近迷上了线段这种东西
现在他手上有 n 条线段,他希望在其中找到两条有公共点的线段,使得他们的异或值最大。 定义线段的异或值为它们并的长度减他们交的长度

输入描述:

第一行包括一个正整数 n,表示 VVQ 拥有的线段条数。
接下来 n 行每行包括两个正整数 l,r,表示 VVQ 拥有的线段的 左右端点。

输出描述:

一行一个整数,表示能得到的最大异或值

示例1
输入

3
10 100
1 50
50 100

输出

99

说明

选择第二条和第三条,99-0=99

备注:

1<=n<=200000,1<=l<=r<=1e8

tags:
容易想到就两种情况:相交或包含。
我们先按左端点排序,设有两个线段 a、b, 且 b 在后,
1】相交, a.l<=b.l && b.l<=a.r && a.r<=b.r 。
答案是 b.r-a.l - (a.r-b.l) = (b.l+b.r) - (a.l+a.r) , 所以只要得到前面最小的 a.l+a.r 即可。
2】包含, a.l<=b.l && b.r<=a.r 。
答案是 (a.r-a.l) - (b.r-b.l) , 所以只要得到前面最大的 a.r-a.l 。
代码:https://paste.ubuntu.com/p/kRFT9XWBzS/

posted @ 2018-04-19 18:19  v9fly  阅读(121)  评论(0编辑  收藏  举报