Највећи тежински збир

Pitanje ili opis problema

[koristite ovaj template za postavljanje tema u kategoriji Pitanja i problemi]
Cao, ja sam napisao kod koji bi trebalo da sigurno radi za ovaj zadatak ali mi padaju poslednja dva primera i nisam sigurean zato. Milsim da je do checkera problem.
Ovo je moj kod:

#include<bits/stdc++.h>

using namespace std;

int n;
long long a[50050];

int main(){
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];

long long sum=0;
for(int i=1; i<n; i++)
sum+=a[i];

long long maxi=0;
for(int i=1; i<n; i++){
maxi+=a[i]*i;
maxi%=1234567;
}

long long curr= maxi;

int perm=0;

for(int i=0; i<n-1; i++){
curr= (curr-sum+(n-1)*a[i])%1234567;
if(curr>maxi){
maxi= curr;
perm=i+1;
}
sum+=a[i]-a[i+1];
}

cout<<perm<<"\n";
cout<<maxi<<"\n";

return 0;
}

Link ka zadatku ili odgovarajućoj stranici

https://petlja.org/biblioteka/r/problemi/zbirka-napredni-nivo/suma_posle_ciklicnog_pomeranja#solution

Problem je u tome sto u poslednjoj for petlji svaki put radis %1234567. To je potrebno raditi samo kada uporedjujemo sa maksimalnom sumom jer nigde nije receno da sumu uvek treba racunati po modulu, potrebno je samo da rezultat bude najveci po modulu 1234567. Evo ispravljenog koda koji radi:

#include<bits/stdc++.h>

using namespace std;

int n;
long long a[50050];

int main()
{
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>a[i];

    long long sum=0;
    for(int i=1; i<n; i++)
        sum+=a[i];

    long long maxi=0;
    for(int i=1; i<n; i++)
    {
        maxi+=a[i]*i;
        //maxi%=1234567; ne ovde
    }

    long long curr= maxi;
    maxi%=1234567; // ovde da

    int perm=0;

    for(int i=0; i<n-1; i++)
    {
        curr= (curr-sum+(n-1)*a[i]);
        if(curr%1234567>maxi) //  pogledaj ovo
        {
            maxi= curr%1234567;
            perm=i+1;
        }
        sum+=a[i]-a[i+1];
    }

    cout<<perm<<"\n";
    cout<<maxi<<"\n";

    return 0;
}

Ukratko, trenutnu sumu ne menjamo po modulu, samo maximalnu.

1 Like

Da vidim. Radi super. Hvala puno!!!