Tongji Online Judge Solutions Welcome to
Tongji Online Judge Solutions by Maigo Akisame Volume 3

我在TJU的所有AC程序及本题解均可在purety.jp/akisame/oi/TJU.rar下载。

  本题虽然数据规模比较大,但输入是比较随机的,也就是说,单纯的模拟就可以了。
  具体的方法是,用一个堆存储每个进程的结束时间,以便及时释放内存;同时用一个双向链表按每个进程在内存中的顺序存储其地址,这样在有新进程申请时就可以通过遍历链表而找到合适的地址运行它(所说的“输入比较随机”,就是指输入没有故意使得每次插入进程时都要遍历整个链表)。当然,还要有一个等待队列。为了让堆和链表同时更新,需要在堆和链表的对应元素间建立互链。这样处理每个进程的流程就可以描述如下:
  1. 读入一个进程的信息;
  2. 将在新进程开始前或开始时结束的进程删除,检查等待队列首的进程是否可以运行;
  3. 判断新进程是可以运行还是需放进等待队列。
  为了在所有进程都放进堆后可以清空堆,可以在最后假设读入了一个在无穷大时间结束的进程。
  上述流程中的第2步的实现要注意:既不能先把在新进程开始前或开始时结束的进程统统删除,再检查等待队列;也不能删除一个进程就检查一次队列。正确的做法是:把与堆顶进程同时结束的进程全部删除,检查等待队列,重复进行直至堆顶进程的结束时间晚于新进程的开始时间。为什么不能采用第2种做法呢?因为堆中元素仅仅按结束时间排序,若删除一个就检查一次等待队列,则可能造成在同时结束的进程中,地址大的先被删除,等待队列首的进程就正好被放在大地址了,而实际上它应该放在小地址,这样就造成了以后的混乱。
  程序只有两行!
  先考虑比较弱的荷叶的作用。假设没有荷叶,那么从一个石墩往另一个石墩只能跳一只青蛙。若有1片荷叶,那么可以让较小的青蛙跳到荷叶上,较大的青蛙从起始石墩跳到目标石墩上,较小的青蛙再跳到较大的青蛙背上。这个过程相当于2只青蛙一起从起始石墩跳到目标石墩上。同理,若有2片荷叶,则相当于3只青蛙一起跳,推而广之,若有m片荷叶,则相当于m+1只青蛙一起跳。这就是荷叶唯一的作用。
  现在去掉荷叶,只考虑石墩。用Fn表示河中有n个石墩,没有荷叶时可以过河的青蛙数。当河中没有石墩时,显然只能过1只青蛙,即F0=1。当河中有n个石墩时,过河过程这样进行,过河的青蛙数最多:
  1. for i:=n downto 1 do 利用i-1个石墩,让Fi-1只青蛙跳到第i个石墩上。
  2. 左岸的一只青蛙直接跳到右岸。
  3. for i:=1 to n do 利用i-1个石墩,让第i个石墩上的Fi只青蛙跳到右岸。
  这样便得到了{Fn}的递推式:Fn=+1。显然{Fn}的通项式为Fn=2n。再把荷叶的作用考虑进去,得出利用n个石墩,m片荷叶可以过河的青蛙数为2n(m+1)。   ∵arctan(1/a)=arctan(1/b)+arctan(1/c)
  ∴1/a=(1/b+1/c)/(1-1/bc),整理得c=a+(a2+1)/(b-a)
  不妨设b≤c,则b≤a+(a2+1)/(b-a),(b-a)2≤a2+1,b≤a+sqrt(a2+1)
  又显然b≥a,故b的取值范围为[a+1,trunc(a+sqr(a2+1))]。
  到此已经可以枚举b,取所有的b+c中的最小值。但仍可利用b+c的单调性进行优化:
  令f(b)=b+c=b+a+(a2+1)/(b-a),对其求导得f'(b)=1-(a2+1)/(b-a)2。∵(b-a)2≤a2+1,∴f'(b)≤0,∴f(b)单调递减。
  因此,可以从trunc(a+sqr(a2+1))开始从大到小依次枚举b,一旦遇到一个整数值f(b),那它就是答案了。   首先说明一点数据的问题:数据中有连续9个数字,但使用longint仍然可以。
  先把右边的项全移到左边。这一步不必真的修改算式,只要在以后处理等号右边时,把正负号反过来即可。以后说到算式,均指移项后的。扫描算式,算出每一位数字的权值(即这一位上的1相当于1后面接几个0)及它所在数字的正负,同时算出算式的左边需要加上多少才能变成0(记为sum)。然后试图修改算式。分两种情况讨论: