1. 程式人生 > >CDOJ 1803 綠帽自動機 思維題

CDOJ 1803 綠帽自動機 思維題

inpu div 決定 desc ret gif header rip n)

題目鏈接:http://acm.uestc.edu.cn/#/problem/show/1803

Description

綠人無數的綠帽俠決定金盆洗手啦!
由於綠帽俠後繼無人,按照祖祖輩輩的祖訓,綠帽俠要把位置傳給這個王國裏綠帽最少的那個人。
但是,綠帽俠曾記得那個被綠的晚上,而那個人,還在王國裏瀟瀟灑灑。
“當然是選擇 不 原諒他啊!”
於是綠帽俠搬出了祖輩流傳的神器:綠帽自動機——對著一個人喊一聲,“你將加冕為王”,除了他以外的所有人,都被戴上一頂綠帽。
綠帽俠決定金盆洗手前,再幹一票!
不為別的,就為了讓當初曾經綠了他的人成為這個王國內唯一的綠帽最多的人!
“屏幕前的你,如果不想被我戴上綠帽的話,就幫我算算,我最少需要喊多少次吧。這條鹹魚還沒熟,我要再烤烤。”
技術分享圖片

Input

第一行兩個整數\(n,x(2≤n≤100000,1≤x≤n)\),表示這個王國有\(n\)個人,綠帽俠希望第\(x\)個人綠帽最多。
第二行包括\(n\)個整數,用空格隔開,第\(i\)個整數\(g_i\)表示第\(i\)個人頭上有\(g_i\)頂綠帽。\((0≤g_i≤10000)\)

Output

輸出一個整數\(a\),表示綠帽俠最少需要喊\(a\)次“你將加冕為王”。

Sample Input and Output

Sample Input Sample Output
5 3
1 1 3 4 4
4
4 2
0 3 2 1
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人綠帽最多,不需喊。


題意

給定\(n\)個數\(g_i\),每次進行操作:指定\(b\),除\(b\)外所有\(g_i\)+1
求至少需要多少次可以使\(g_x\)最大

題解

操作可以分成兩步:
1、所有\(g_i\)+1
2、\(g_b\)-1
顯然第1步不會影響所有數之間的大小關系,只有第2步會,那麽就數所有比\(g_x\)大的那些數比\(g_x-1\)大多少就好了,畢竟比\(g_x-1\)大的都得減去=-=

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100000+10;
int g[MAXN];
int sum;
int main()
{
    int n,x;
    cin>>n>>x;
    for(int i=1;i<=n;++i)   cin>>g[i];
    for(int i=1;i<=n;++i)   if(g[i]>=g[x])  sum+=(g[i]-g[x]+1);
    cout<<sum-1;
    return 0;
}

出題人是條鹹魚=-=


版權所有:scidylanpno
原文鏈接:http://www.cnblogs.com/scidylanpno/p/7977838.html

CDOJ 1803 綠帽自動機 思維題