题目:
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