Codevs 喝咖啡

点击就送屠龙宝刀

题目描述 Description
东海龙王邀请葫芦娃喝咖啡(多么奇葩的背景啊!)龙王知道葫芦娃喜欢葫芦娃喜欢特定浓度的咖啡(咖啡浓度为0到1直接的小数,不超过9位),龙王想知道葫芦娃所想要的咖啡能否被调出(东海地大物博,咖啡无限供应)……

嘿!水娃……。

输入描述 Input Description
第一行一个数N表示龙王有的咖啡种数

接下来N行表示龙王的咖啡具体浓度

接下来一行一个数M表示葫芦娃的要求数

接下来M行表示葫芦娃的具体要求

输出描述 Output Description
共M行,如果葫芦娃的那个要求可以被满足则输出YES否则输出NO

样例输入 Sample Input
4

0.65

1

0.8

0.6

3

0.4

0.75

0.7

样例输出 Sample Output
NO

YES

YES

数据范围及提示 Data Size & Hint
P.S.

浓度为0.75的咖啡可以用两杯浓度为0.8的咖啡与一杯浓度为0.65的咖啡调成

浓度为0.7的咖啡可以用一杯浓度为0.8的咖啡与一杯浓度为0.6的咖啡调成

N,M<100,000,000

咖啡浓度最长保留9位

好惊悚的白银题是不是?

However marshtomp would see everything

这题坑惨了好多同学呢QAQ

这道题233333不说什么了我们来讨论解法。。对于大触,他们看到浓度道小数点后9位就开始了高精度除法。。。然而并没有什么卵用因为你有可能除着除着存在精度问题而且可能会炸。。。。
所以我们继续看题。我们发现:对于两个不同的浓度(假设为a,b),如果把他们混合到一起,那么我们就会得到(a+b)/2的浓度的咖啡。那么问题来了,这个条件有什么用呢?慢慢分析。对于每次询问,我们有龙王的咖啡浓度的最大值和最小值,那么我们能配除的浓度是什么呢?显然是大于等于最小值小于等于最大值的。因为无论最小值加上哪一个除以二答案都是大于等于最小值的。这样我们就得到了浓度的下界,同理可以得出浓度的上界。那么在这个区间内,我们可以假设一个浓度i。如果i可以用a,b两种浓度混合得到,那么a,b一定在区间内有解。同理可以推出来a,b的生成。那么继续推我们得到了什么呢?没错就是给定条件可以产生一组浓度a,b,且(a+b)/2=i。这样我们就得到了答案。因为i是a,b区间内任意值,那么我们就知道了对于给定条件范围内的咖啡浓度都能得到,因为没有要求输出如何混合,所以只需要判断询问是否处于这个区间内就可以了。

#include

using namespace std;

int main()
{
    int n,m;
    cin>>n;
    double max=0,min=1,x;
    for(int i=0;icin>>x;
        if(maxif(min>x)min=x;
    }
    cin>>m;
    for(int i=0;icin>>x;
        if(max>x&&mincout<<"YES"<else
        cout<<"NO"<return 0;
}

你可能感兴趣的:(codevs题目)