Educational Codeforces Round 114 (Rated for Div. 2)

Posted 未定_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 114 (Rated for Div. 2)相关的知识,希望对你有一定的参考价值。

C.Slay the Dragon
题意:你有n个英雄,知道每个英雄的攻击力(a1,a2...an)以及每条龙的防御力x和攻击力y,每次你只能派出一个英雄去屠龙,剩下的英雄守城,只有当派出去的英雄的攻击力大于等于龙的防御力且剩余英雄的攻击力之和大于等于龙的攻击力时,才能屠龙。你可以给任何一个人英雄增加1点攻击力需要1枚硬币,求成功屠龙需要得最少硬币数。

分析:既要保证派出去的一个英雄攻击力合适,又要保证剩下的英雄攻击力合适。从两个方面考虑:如果考虑派出去的一个英雄的话,应该让英雄的攻击力尽可能等于龙的防御力,或者比龙的防御力大一点,这样这一个英雄不需要硬币,硬币数为龙的攻击力与剩余英雄的攻击力之差。如果考虑剩下的英雄的话,为了不让派出去的这一个英雄花费太大,我们考虑派出去的英雄的攻击力比龙的防御力低的同时要尽可能接近龙的防御力,这样剩余英雄的花费相对减小,需要的硬币数为派出去的英雄需要花的硬币与剩余英雄需要花的硬币之和。以上两方面取最小值即可。

注意,本题数范围太大,用long long,并且cin时间限制。

一开始想的太复杂啦,想把所有情况都列举一下,又复杂又容易出错,不会变通,而且知识学了想不起来用。。。

继续挂图

#include<bits/stdc++.h>
using namespace std;
long long a[200005];
long long f(long long x)
{
    if(x>0)
        return x;
    else return 0;
}
int main()
{
    long long n,sum=0,m,x,y;
    scanf("%lld",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%lld",&a[i]);
        sum+=a[i];
    }
    sort(a,a+n);
    cin>>m;
    while(m--)
    {
        scanf("%lld%lld",&x,&y);
        int i=lower_bound(a+1,a+n,x)-a;//从第二个英雄开始找大于等于x的第一个位置,保证i-1>=0
        cout<<min(f(x-a[i])+f(y-sum+a[i]),f(x-a[i-1])+f(y-sum+a[i-1]))<<endl;
    }
    return 0;
}

以上是关于Educational Codeforces Round 114 (Rated for Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 7 A

Educational Codeforces Round 7

Educational Codeforces Round 90

Educational Codeforces Round 33

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 27