https://jungol.co.kr/problem/5346
h1과 h2를 같게 만들기 위한 유일한 방법은 h2와 h3에서 어떠한 수를 빼주는것입니다. 마찬가지로 h3와 h4를 같게 만들기 위한 유일한 방법은 h4와 h5에서 어떠한 수를 빼주는 것입니다. 만약 빼줄 수 없다면, 즉 더해주어야 같게 맞추어진다면 -1을 출력해주면 됩니다.
이를 반복하면 h1과 h2가 같아지고, h3와 h4가 같아지고,... 가 됩니다. 이때 N의 홀짝성에 따라서 풀이가 나누어지게 됩니다.
만약 N이 짝수라면, 먼저 hN-1과 hN이 같은지를 확인해주어야합니다. 만약 다르다면, -1을 출력해주면 됩니다. 만약 같다면, h1과 h2를 세트, h3과 h4를 세트, ... hN-1과 hN을 세트로 놓고 그 세트중 최솟값을 기준으로 모든 세트를 맞추어주면 됩니다. 그런데 만약 그 최솟값이 음수라면, -1을 출력해주고, 아니면 먹이를 준 값을 출력해주면 됩니다.
N이 홀수라면, 지금까지 했던 행동을 뒤에서부터 다시 해주면 됩니다. 그러면 모든 수가 같아지게 됩니다. 물론 이 경우에도 음수로 맞추어지는 경우는 빼주어야합니다.
#include <iostream>
#define ll long long
using namespace std;
ll arr[101010]={0};
void solve()
{
ll N,i,res=0;
cin>>N;
for (i=1;i<=N;i++) cin>>arr[i];
for (i=2;i<N;i+=2)
{
ll diff=arr[i]-arr[i-1];
if (diff<0)
{
cout<<"-1\n";
return;
}
arr[i]-=diff;
arr[i+1]-=diff;
res+=diff;
}
if (N%2==0)
{
if (arr[N]!=arr[N-1])
{
cout<<"-1\n";
return;
}
ll mn=1e18;
for (i=1;i<=N;i++) mn=min(mn,arr[i]);
for (i=1;i<=N;i+=2)
{
res+=arr[i]-mn;
arr[i]=arr[i+1]=mn;
}
}
else
{
for (i=N-1;i>=2;i-=2)
{
ll diff=arr[i]-arr[i+1];
if (diff<0)
{
cout<<"-1\n";
return;
}
arr[i]-=diff,arr[i-1]-=diff;
res+=diff;
}
}
for (i=1;i<=N;i++)
{
if (arr[i]<0)
{
cout<<"-1\n";
return;
}
}
cout<<res*2<<"\n";
return;
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
ll T;
cin>>T;
while (T--)
solve();
}

| 초직사각형 (JUNGOL 4729) (0) | 2026.06.01 |
|---|---|
| 센터가 돋보여야 해 (JUNGOL 6122) (0) | 2026.06.01 |
| 최대 부분수열 (JUNGOL 4188) (0) | 2026.05.31 |
| Absolute Cinema (CF R 1100 Div.1 + Div.2 - B) (0) | 2026.05.30 |
| Slimes on a Line (CF R 1100 Div.1 + Div.2 - A) (0) | 2026.05.30 |