第九届ACM趣味程序设计竞赛第二场(正式赛) B - 绿帽自动机【思维】

B - 绿帽自动机

Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)

绿人无数的绿帽侠决定金盆洗手啦!
由于绿帽侠后继无人,按照祖祖辈辈的祖训,绿帽侠要把位置传给这个王国里绿帽最少的那个人。
但是,绿帽侠曾记得那个被绿的晚上,而那个人,还在王国里潇潇洒洒。
“当然是选择 不 原谅他啊!”
于是绿帽侠搬出了祖辈流传的神器:绿帽自动机——对着一个人喊一声,“你将加冕为王”,除了他以外的所有人,都被戴上一顶绿帽。
绿帽侠决定金盆洗手前,再干一票!
不为别的,就为了让当初曾经绿了他的人成为这个王国内唯一的绿帽最多的人!
“屏幕前的你,如果不想被我戴上绿帽的话,就帮我算算,我最少需要喊多少次吧。这条咸鱼还没熟,我要再烤烤。”
title

Input

第一行两个整数n,x(2≤n≤100000,1≤x≤n)n,x(2≤n≤100000,1≤x≤n),表示这个王国有nn个人,绿帽侠希望第xx个人绿帽最多。
第二行包括nn个整数,用空格隔开,第ii个整数gigi表示第ii个人头上有gigi顶绿帽。(0≤gi≤10000)0≤gi≤10000)
Output
输出一个整数aa,表示绿帽侠最少需要喊aa次“你将加冕为王”。

Sample Input

5 3
1 1 3 4 4

Sample Output

4

Sample Input

4 2
0 3 2 1

Sample Output

0

Hint

Sample 1:
第1次,对第4人喊“你将加冕为王”,整体绿帽变为 [ 2 2 4 4 5 ]
第2次,对第5人喊“你将加冕为王”,整体绿帽变为 [ 3 3 5 5 5 ]
第3次,对第4人喊“你将加冕为王”,整体绿帽变为 [ 4 4 6 5 6 ]
第4次,对第5人喊“你将加冕为王”,整体绿帽变为 [ 5 5 7 6 6 ]
此时,第3人绿帽最多。
可以证明,至少需要4次。
Sample 2:
第2人绿帽最多,不需喊。

题意 :对哪个数喊,喊的数不变,其余的数都加一,指定了某个数最后是最大的,问你最少需要喊的次数

分析: 首先我们可以发现,比指定的数小的数我们可以忽略,只考虑比指定数大和相等的即可,我们可以发现只要喊比指定数大的数,被喊的和指定数的相对值会加一,比如 2 2,指定数为第一个,那么我们肯定是对第二个数喊,喊之前的相对差为0,之后为1,而只有这两个数的相对差有变化,其余的都没有,所以只要for一遍即可,找到比指定数大的数。

参考代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;


int a[100010];
int main() {
    int n,x;cin>>n>>x;
    ll s = 0;
    for(int i = 1;i <= n;i++)
        scanf("%d",&a[i]);
    for(int i = 1;i <= n;i++) {
        if( i == x) continue;
        if(a[i] >= a[x]) {
            s += a[i]-a[x] + 1;
        }
    }
    cout<<s<<endl;
    return 0;
}
  • 如有错误或遗漏,请私聊下UP,thx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值