C++ 2023诸暨小学 顶级玩家 答案及解析(新人求支持,谢谢各位大佬)

题目:

Ava是一个很厉害的游戏玩家。这天,她在玩一个小游戏。这个游戏是这样子的,有n个石柱排成一排,第i个石柱的高度是ai。初始Ava可以选择一个石柱然后跳到上面,跳上这个石柱后,除了当前石柱别的石柱的高度都会增加1。之后每次Ava都可以跳到比当前石柱高度恰好高1的石柱上,假设她从u石柱跳到了v石柱,那么跳上v石柱之后,除了v石柱其他每个石柱的高度都会增加1。Ava想知道她能跳上的最高的石柱高度是多高,你能帮她解决这个问题吗?

输入

从文件player.in 中读入数据。输入两行,第一行一个正整数 n。

接下来一行n个正整数ai,表示石柱的高度。

输出

输出一行表示答案。

样例输入

4
1 2 1 3

样例输出

3

样例解释:

第一次跳到高度为1的台阶,最后站在石柱高度为2;

第一次跳到高度为2的台阶,最后站在石柱高度为2;

第一次跳到高度为3的台阶,最后站在石柱高度为3;

所以能站的最高的石柱高度为3。

那不讲废话我们直接开讲干货(^-^)

解析:

这道题目有些绕口,总体来说就是:
1.第一次,你可以随便跳到任意一个石柱。
2.之后,你只能跳到比该石柱高1的石柱上。
3.重复执行条件2。
问:能跳到的最高高度是多少?


没有思路的人,只能骗分。假设以一次就能跳到最高点,只需找max(a1,a2,a3,…an).这样子的,恭喜你,获得0分(我试过了) (^-^).

所以,我们不能这样,可以进行桶排.但数据最大有10^9,数组会越界,所以也没有满分。

看来,这道题目我们得用数学思想来解决:

先随便订组测试数据。
4
1 2 3 4

答案是一跨跨到4.
这是我们不妨假设先跳到1。后面的2,3,4变成了3,4,5,跳不上去了.
假设先跳到2,除2以外的变成了2,4,5,跳不上去了。
假设先跳到3,同理,又跳不上去了。
所以,最优解是直接跳到4上面。(Ava真惨,如果大一点,还不是爬得累死)
因此,我们可以得出一个结论:当数不一样时,我们只能跨到最高点。
反一下,只有数相同的时候,才能一步一步跳上去。

不妨假设测试数据为:
5
1 1 1 2 2

答案是3.
先跳到1,后面变成了2,2,3,3。再跳到2,后面变成了3,4,4。然后再跳到3.
或者先跳到2,除2以外的变成了2,2,2,3.再跳到3.
(总比一下跳到2好)
3个1,答案是3.除了第一个1,剩下的都可以增加(1+(3-1));
2个2,答案也是3.除了第一个2,剩下的都可以增加(2+(2-1)).

所以答案只需打擂台(以sum代表有几个相同):ma=max(ma,a[i]+sum-1).


最后注意,测试数据不一定是升序,要快排(sort)!

满分程序:

#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],ma,i,sum=1;
int main()
{
    cin>>n;
    for(i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    for(i=1;i<=n;i++){
        if(a[i]==a[i+1]) sum++;
        else sum=1;
        ma=max(ma,a[i]+sum-1);
    }
    cout<<ma<<endl;

注:oj网站上有原题题号 6179

网站 oj.nbdp.net

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值