[SCOI2016]妖怪 牛客网的ACM省选题,个人看法,欢迎交流

链接:https://ac.nowcoder.com/acm/contest/390/1001
来源:牛客网

题目描述

邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性。邱老师立志成为妖怪大师,于是他从真新镇出发,踏上未知的旅途,见识不同的风景。环境对妖怪的战斗力有很大影响,在某种环境中,妖怪可以降低自己k×a点攻击力,提升k×b点防御力或者,提升自己k×a点攻击力,降低k×b点防御力,a,b属于正实数 ,k为任意实数,但是atk和dnf必须始终非负。妖怪在环境(a,b)中的战斗力为妖怪在该种环境中能达到的最大攻击力和最大防御力之和。strength(a,b)=max(atk(a,b))+max(dnf(a,b))环境由a,b两个参数定义,a,b的含义见前 文描述。比如当前环境a=3,b=2,那么攻击力为6,防御力为2的妖怪,能达到的最大攻击力为9,最大防御力为6。 所以该妖怪在a=3,b=2的环境下战斗力为15。因此,在不同的环境,战斗力最强的妖怪可能发生变化。作为一名优秀的妖怪训练师,邱老师想发掘每一只妖怪的最大潜力,他想知道在最为不利的情况下,他的n只妖怪能够达到的 最强战斗力值,即存在一组正实数(a,b)使得n只妖怪在该环境下最强战斗力最低。

输入描述:

第一行一个n,表示有n只妖怪。
接下来n行,每行两个整数atk和dnf,表示妖怪的攻击力和防御力。
1 ≤ n ≤ 10^6, 0<atk,dnf ≤ 10^8

输出描述:

输出在最不利情况下最强妖怪的战斗力值,保留4位小数。
示例1

输入

3 
1 1 
1 2 
2 2

输出

8.0000

解题思路

首先,对于一只妖怪,在(a,b)环境下,它可能会增强ka的攻击力,同时相应的会降低kb的防御力,但是它的防御力为非负,所以它的攻击力最大的时候,也就是它的防御力为零的时候。同理,它的防御力最大的时候,它的攻击力为零。由此,我们可以得到在(a,b)环境下,妖怪攻击力最大时的k值k1,和防御力最大时的k值k2。

设妖怪的初始攻击力为x0,初始防御力为y0。它在(a,b)环境下的最大攻击力为x0+k1*a,最大防御力为y0+k2*b,其中k1、k2满足y0-k1*b=0x0-k2*a=0。

那么该妖怪在环境(a,b)中的战斗力为

 

 

变换可得到

 

 

即当,F具有最小值,此时的 环境(a,b)为该妖怪最不利的环境。

 

 

Python代码

import sys 
maxv = 0.0
maxxy = [1,2]
ad = []
lines = sys.stdin.readlines()
for i in lines[1:]:
    i = i.split()
    x0 = int(i[0])
    y0 = int(i[1])
    F = x0+y0
    if F>maxv:
        maxv = F
        maxxy = [x0,y0]
x = maxxy[0]**0.5
y = maxxy[1]**0.5
maxv = (x+y)**2
print('%.4f'%(maxv))  

 

 

 仅为个人看法,不对的地方,请指正。主流的解法是使用凸包什么的,对这方面知识不是很足,我也不知道我这做法对不对,欢迎交流!

 

 

 

 

 

 

posted on 2019-09-05 15:40  桩子101  阅读(277)  评论(2编辑  收藏  举报