Hoon222y

[BOJ 1744] 수 묶기 본문

코딩/BOJ & 알고스팟

[BOJ 1744] 수 묶기

hoon222y 2017. 8. 27. 15:11

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


그리디 문제이다. 문제의 함정은 

1) 양수는 양수끼리 2) 음수는 음수끼리 3) 1은 되도록 묶지 말아야 한다. 4) 0은 묶지 않는것이 최대


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <cmath>
#include <stdio.h>
 
#define INF 1e9
typedef long long ll;
using namespace std;
 
ll ans, n,arr[5],one,zero;
vector<int> plu;
vector<int> minu;
 
int main(){
    cin >> n;
    one = 0;
    zero = 0;
    memset(arr,0,sizeof(arr));
    
    for(int i=1;i<=n;i++){
        int a;
        cin >> a;
        if (a == 1){
            one++;
        }
        else if(a<0){
            minu.push_back(a);
        }else if(a == 0){
            zero++;
        }else {
            plu.push_back(a);
        }
    }
    if(plu.size()%2 == 1){
        plu.push_back(1);
    }
    if(minu.size()%2 == 1){
        if(zero>0){
            minu.push_back(0);
        }else {
            minu.push_back(1);
        }
    }
    ans = one;
    sort(plu.begin(),plu.end());
    reverse(plu.begin(), plu.end());
    sort(minu.begin(),minu.end());
    
    for(int i=0;i<plu.size();i+=2){
        ans += plu[i]*plu[i+1];
    }
    for(int i=0;i<minu.size();i+=2){
        ans += minu[i]*minu[i+1];
    }
    cout <<ans<<endl;
  
    
    return 0;
}
 
cs


'코딩 > BOJ & 알고스팟' 카테고리의 다른 글

[BOJ 1946] 신입 사원  (0) 2017.08.27
[BOJ 2458] 키 순서  (0) 2017.08.27
[BOJ 1781] 컵라면  (0) 2017.08.26
[BOJ 3273] 두 수의 합  (0) 2017.08.24
[BOJ 11058] 크리보드  (0) 2017.08.24
Comments