在连续几天的没日没夜后,wy学姐颤颤巍巍地翻出了一个珍藏多年的宝典,只见上面赫然写着——《凡人修仙传》!
她正在可怜兮兮地临时抱佛脚来试图提升自己目前的实力以获得最后的胜利。
事情是这样的,wy学姐本来卡在瓶颈期多年,经过前几天的修炼,隐隐有突破之势,如今金身已就,眼看神功大成,只差渡劫!
就在这时,天空一道惊雷,她落入了一个结界之中,这正是她飞升的最后一道关卡!
这个结界里有很多斗法者,而她需要与其中的优胜斗法者(即最后的胜利者)进行对决,赢则飞升。
为了渡过此劫、成功飞升,谨慎起见,她决定先打探一下对手的情况。
那些人的斗法是这样的,n个斗法者排成一队(随机),前俩名斗法者打一场,输的人 走到队伍的最后,赢的人继续与下一个斗法者对决,依次类推,直到有人能连胜k场为止。
对于这种修仙对决,自然是修炼层数越高的人能获胜啦。
正所谓知己知彼,百战不殆。
wy学姐坚信,只要能提前准确地预测出她的对手,她就能在这短暂的时间内找到越级(或许不是呢qwq)挑战胜利的办法!
你能帮她找到修练到多少层的人会获胜吗?
Input
第一行输入两个整数: n and k (2 ≤ n ≤ 500, 2 ≤ k ≤ 1012) ——n代表排队的斗法者人数,k代表要连胜的场数
第二行有 n 个整数 a1, a2, ..., an (1 ≤ ai ≤ n)——即队伍中每个人修炼神功的层数。保证每个人各不相同。
Output
输出一个整数——最后的优胜斗法者修炼到的功力层数.
Examples
Input
2 2 1 2
Output
2
Input
4 2 3 1 2 4
Output
3
Input
6 2 6 5 3 1 2 4
Output
6
Input
2 10000000000 2 1
Output
2
题目大概意思是从左到右找出第一个连胜k场的人,这个题目其实不难,我当时因为没有想到一个小细节才导致我没有写出来。
简单分析一下连胜k场才能赢,那如果k大于等于对手人数,就是说渡劫成功需要和除自己以外的所有人交手,所以层数最高的人才能渡劫成功,如果k<n-1那么需要从左到右遍历一次,如果有一个人先达到k次胜场就输出那个人的功法层数,注意第一个人要赢k场,之后的人需要再赢k-1场,看代码就完事了
#include<iostream>
using namespace std;
int main()
{
int n, num[1005] = { 0 }, max = -1, flag = 1, i;//max记录最大功法层数
long long m;
cin >> n >> m;
for (i = 0; i < n; i++)
{
cin >> num[i];
if (num[i] > max)
max = num[i];
}
if (m >=(long long)n-1)//k>n-1直接输出max
cout << max;
else
{
for (i = 0; i < n; i++,flag=1)
{
for (int j = i + 1; j <n&&j<=i+m; j++)
{
if (num[i] < num[j])
{
flag = 0;
i = j-1;
break;
}
if (i != 0 && j == i + m - 1)//已经赢了前面那个人,只需要再赢k-1场
break;
}
if (flag == 1)
{
cout << num[i];
break;
}
}
}
return 0;
}