BOJ 2437 : 저울

2020. 8. 17. 01:38PS/Greedy

https://www.acmicpc.net/problem/2437

 

2437번: 저울

하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다. 이 저울의 양 팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고, 양팔의 길이는 같다. 또한, 저울의 한쪽에는 저울추들만 놓�

www.acmicpc.net

이 문제는 코드는 아주 간단한데 왜 성립되는지 조금 생각해야 하는 문제이다.

일단 추를 정렬하자.

1부터 i까지의 합을 sum이라고 하자. (1<=i<=n)

sum에 추로 1부터 sum까지 모두 표현 가능하다는 가정을 할 것이다.

a[i]값이 sum의 값보다 작으면 다른 추를 이용해서 sum까지의 수를 다 표현할 수 있기에 sum의 가정을 만족한다.

하지만 a[i]값이 sum의 값보다 크면 sum과 a[i]사이의 값은 존재하지 않음을 알 수 있다. 

그러므로 O(n)만에 그런 값을 찾으면 끝.

#include <bits/stdc++.h>
#define MEM 1004
#define sanic ios_base::sync_with_stdio(0)
#define f first
#define s second
#define pb push_back
#define all(x) ((x).begin()),((x).end())
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
const ll MOD = 1e9+7;
ll t,n;
ll a[MEM];
int main() {
    sanic; cin.tie(0);
    cin >> n;
    for(int i=0; i<n; i++)
        cin >> a[i];
    sort(a,a+n);
    ll sum=0;
    for(int i=0; i<n; i++){
        if(sum+1<a[i]) break;
        sum += a[i];
    }
    cout << sum+1;
}

'PS > Greedy' 카테고리의 다른 글

BOJ 2516 : 원숭이  (1) 2021.08.06
BOJ 2923 : 숫자 게임  (0) 2021.08.06