E. Die Mauer durchbrechen

原题链接
Monocarp spielt „Rage of Empires II: Definitive Edition“ – ein strategisches Computerspiel. Im Moment plant er, seinen Gegner im Spiel anzugreifen, aber Monocarps Streitkräfte können das gegnerische Territorium nicht betreten, da der Gegner eine Mauer errichtet hat.

Die Wand besteht aus n Abschnitten, die in einer Reihe angeordnet sind. Der i-te Abschnitt hat zunächst die Dauerhaftigkeit ai. Wenn die Haltbarkeit eines Abschnitts 0 oder weniger beträgt, gilt dieser Abschnitt als defekt.

Um den Gegner anzugreifen, muss Monocarp mindestens zwei Abschnitte der Mauer durchbrechen (zwei beliebige Abschnitte: möglicherweise benachbart, möglicherweise nicht). Dazu plant er den Einsatz eines Onagers – einer speziellen Belagerungswaffe. Mit dem Onager kann jeder beliebige Abschnitt der Wand beschossen werden; Der Schuss fügt dem Zielabschnitt 2 Schaden und den angrenzenden Abschnitten 1 Schaden zu. Mit anderen Worten, wenn der Onager auf den Abschnitt x schießt, dann verringert sich die Haltbarkeit des Abschnitts x um 2, und die Haltbarkeit der Abschnitte x−1 und x+1 (falls vorhanden) verringert sich jeweils um 1.

Monocarp kann beliebig oft auf beliebige Abschnitte schießen, er kann sogar auf gebrochene Abschnitte schießen.

Monocarp möchte die Mindestanzahl an Onager-Schüssen berechnen, die erforderlich sind, um mindestens zwei Abschnitte zu durchbrechen. Hilf ihm!

Eingabe
Die erste Zeile enthält eine Ganzzahl n (2≤n≤2⋅105) – die Anzahl der Abschnitte.

Die zweite Zeile enthält die Folge der ganzen Zahlen a1,a2,…,an (1≤ai≤106), wobei ai die anfängliche Haltbarkeit des i-ten Abschnitts ist.

Ausgabe
Gibt eine ganze Zahl aus – die Mindestanzahl an Onager-Schüssen, die erforderlich sind, um mindestens zwei Abschnitte der Wand zu durchbrechen.

Beispiele

inputCopy
5
20 10 30 10 20
outputCopy
10
inputCopy
3
1 8 1
outputCopy
1
inputCopy
6
7 6 6 8 5 8
outputCopy
4
inputCopy
6
14 3 8 10 15 4
outputCopy
4
inputCopy
4
1 100 100 1
outputCopy
2
inputCopy
3
40 10 10
outputCopy
7

Hinweis
Im ersten Beispiel ist es möglich, den 2. und den 4. Abschnitt in 10 Schüssen zu unterbrechen, beispielsweise indem der dritte Abschnitt 10 Mal geschossen wird. Danach betragen die Haltbarkeiten [20,0,10,0,20]. Eine andere Möglichkeit besteht darin, 5 Schüsse auf den 2. Abschnitt und weitere 5 Schüsse auf den 4. Abschnitt abzufeuern. Danach betragen die Haltbarkeiten [15,0,20,0,15].

Im zweiten Beispiel reicht es aus, den 2. Abschnitt einmal zu drehen. Dann werden der 1. und der 3. Abschnitt durchbrochen.

Im dritten Beispiel reicht es aus, den 2. Abschnitt zweimal abzuschießen (dann betragen die Haltbarkeiten [5,2,4,8,5,8]) und dann den 3. Abschnitt zweimal abzuschießen (dann betragen die Haltbarkeiten). [5,0,0,6,5,8]). Vier Schüsse reichen also aus, um den 2. und 3. Abschnitt zu durchbrechen




Die Idee ist sehr einfach, sie besteht darin, entsprechend der Situation zu diskutieren (drei Arten von Situationen, Einzelheiten finden Sie im Code).
Warum kann sie nicht während des Wettbewerbs geschrieben werden?

#include<bits/stdc++.h>
using namespace std;
int const N=2e5+10;
int a[N];
int res=1e9;
int main()
{
    
    
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
        
      //击破相邻的
    for(int i=1;i<n;i++)
    {
    
    
        res=min(res,max(max((a[i]+1)/2,(a[i+1]+1)/2),(a[i]+a[i+1]+2)/3));
    }

  	//击破该值左右两边的
    for(int i=2;i<n;i++)
    {
    
    
        res=min(res,min(a[i+1],a[i-1])+(abs(a[i-1]-a[i+1])+1)/2);
    }

    sort(a+1,a+1+n);
    //击破互不相干的;
    res=min(res,(a[1]+1)/2+(a[2]+1)/2);
    cout<<res<<endl;
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_52879528/article/details/124553528
conseillé
Classement