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