拳王争霸

问题 A: 拳王争霸

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

泽泽的爱好非常广泛,拳击比赛是他的爱好之一。电视里正在播放拳王争霸赛,n个人排成一排,他们进行拳击比赛,先让最前面两个人进行比赛,赢的人再和下面一个人比赛,输的人排到队伍的末尾。每一次比赛的结果是由比赛的两个人的能量确定,能量大的人胜(注:保证所有人的能量都不同,假设所有人的能量能瞬间恢复,精力一直是旺盛的)。大赛规定:只要能连续获胜 k 场的人将成为“拳王”。

输入

第一行输入两个整数n和k,分别表示总人数和需要连续获胜的次数。
第二行有n个整数,A_1,A_2,...,A_n(1<=A_i<=n),分别表示每个人的能量。

输出

输出一个整数,就是 “拳王”的能量。

样例输入 Copy

【样例1】
2 2
1 2

【样例2】
4 2
3 2 1 4

【样例3】
2 10000000000
2 1

样例输出 Copy

【样例1】
2

【样例2】
3

【样例3】
2

提示

【样例2解释】
有4个人参赛,只要能按比赛规定连续获得2次胜利,那个人就是拳王。
第1个人的能量是3,他先跟能量2打,能量3获得胜利,能量2排到队伍的末尾。能量3再跟能量1打,能量3继续获胜。 他连续两次获胜,所以他成为“拳王”。
【数据范围约定】
对于50%的数据,保证2<=k<=n。
对于100%的数据,保证 2<=n<=500,2<=k<=1000000000000。
 
 
该题是一个贪心问题:首先你不能暴力跑,也不用把输的放在最后,应为在最大值之前有最优解就是该值,否则就是那个最大值
在这些参赛选手中如果你能遍历到最大值那么获胜者一定是那个最大值,那就看在最大值之前有没有最优解:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;}
typedef long long ll;
const int maxn=1e6+10;
const int M=1e3+10;
const int INF=0x3f3f3f3f;
ll a[maxn];
int main()
{
    ll n,k,j;
    cin>>n>>k;
    int ans=0;//最大 
    for(int i=0;i<n;i++){
        cin>>a[i];
        if(a[i]>ans){
            ans=a[i];
            j=i;
        }
    }
    int flag=0;//到最大值变成1; 
    for(int i=0;i<n;i++){
        if(i==j){
            flag=1;
            break;
        }
        int ans=0;
        int y=i+1;
        while(a[i]>a[y]){
            y++;
            ans++;
        }
        if(ans>=k){
            printf("%lld",a[i]);
            return 0;
        } 
    }
    if(flag){
        printf("%lld",a[j]);
    }
    return 0;
}

 

posted @ 2020-01-14 14:59  lipu123  阅读(562)  评论(0编辑  收藏  举报