环太平洋——线段树(1)

题目背景

怪兽们开起了通往地球的虫洞,开始在地球上肆虐起来,此时人们放下各国仇恨,想出了一些办法,通过再三审核,人们决定造出属于我们自己的战甲,与怪兽开战。但驾驶机甲所需要承受的神经元运运超过人类大脑能成受神经元。所以为了不让驾驶员死亡,必需两个人以上才能操控战甲,如果这两个人的默契值越大,机甲的战斗力就越强,为了能更快地击败怪兽,人们组织了一场选拔。

题目描述

在这里会有n位候选人,和机架的初始战斗力(初始战斗力就是在两个人默契值为0的状况),和怪兽的战斗力m,但时间紧迫,眼看怪兽就要打过来了,可我们这边却只有一位战士,军方会给出这名战士与n位候选人的默契值,所以总战斗力就是(默契值/100)*m+m的值为了击败怪兽,请你输出最大的总战斗力,并判断能否击败怪兽,如果能就输出Victory,如果不能就输出Lose。人们光荣的把这个任务交给了你,请你完成任务。

输入输出格式

输入格式:

输入n,战甲初始战斗力,怪兽的战斗力,输入n个默契值。

输出格式:

请按题目描述输出。

输入输出样例

输入样例#1:

5 1000 1500
1 0 50 45 44

输出样例#1:

1500
Victory

  这是一道线段树的题,你只需要找到区间最大值然后再套个公式就可以,代码:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
int tree[410000000],ans[41000000],a[41000000];
int n,m;
int ls(int x)
{
    return x*2;//左儿子 
}
int rs(int x)
{
    return x*2+1;//右儿子 
}
void build(int x,int l,int r)
{
    int mid=(l+r)/2;//建树 
    if(l==r)
    {
        tree[x]=a[l];
        return ;
    }
    build(ls(x),l,mid);
    build(rs(x),mid+1,r);
    tree[x]=max(tree[ls(x)],tree[rs(x)]);//找到当前最大值 
}
int search(int p,int l,int r,int x,int y)
{
    if(x<=l&&y>=r)
    {
        return tree[p];
    }
    int mid=(l+r)/2;
    if(y<=mid) return search(ls(p),l,mid,x,y);
    if(x>mid) return search(rs(p),mid+1,r,x,y);
    return(max(search(ls(p),l,mid,x,y),search(rs(p),mid+1,r,x,y)));//比较输出 
}
int main()
{
	int k; 
    int x,y;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);//建树 
    double len=search(1,1,n,1,n);
    double len2=double(len/100)*double(m)+double(m);
    cout<<len2<<endl;
    if(len2>=k) cout<<"Victory";//输出 
    else cout<<"Lose";
}

  PS:本题纯属原创

猜你喜欢

转载自www.cnblogs.com/dai-jia-ye/p/9264708.html