길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm

[백준 7795번] 먹을 것인가 먹힐 것인가 (C++)

2022. 4. 12. 19:31

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

 

7795번: 먹을 것인가 먹힐 것인가

심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을

www.acmicpc.net


먹을 것인가 먹힐 것인가 문제는 누적을 이용하여 해결할 수 있습니다.

 

크기가 1인 A 생명체가 먹을 수 있는 먹이는 크기가 8인 A 생명체가 모두 먹을 수 있습니다.

따라서 생명체 A, B의 배열을 모두 정렬한 다음, 크기가 작은 A 생명체부터 먹을 수 있는 먹이의 개수를 구하고.

다음 크기의 A 생명체는 이전 A 생명체가 먹을 수 없었던 생명체부터 먹을 수 있는 먹이의 개수를 구하면 됩니다. 

 

아래는 전체 코드입니다.

#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int t; cin >> t; 
    while(t--){
        int n, m; cin >> n >> m;
        int a[20000], b[20000];
        for(int i = 0; i < n; i++) cin >> a[i]; // A 생명체 입력 받음
        for(int i = 0; i < m; i++) cin >> b[i]; // B 생명체 입력 받음
        sort(a, a + n); sort(b, b + m);

        // start는 이전 생명체가 먹지 못했던 B 생명체의 idx
        // t = 전체 쌍의 개수
        // accu는 이전 생명체가 먹을 수 있는 먹이의 개수
        int start = 0, t = 0, accu = 0; 
        for(int i = 0; i < n; i++){
            int cur = start;
            while(cur < m && a[i] > b[cur]) cur++;
            // cur >=m 이거나 a <= b[cur]인 경우 while문 빠져나옴
            // cur - start는 먹이의 개수
            accu = accu + (cur - start);
            t += accu; start = cur;
        }
        cout << t << "\n";
    }
}

'Algorithm' 카테고리의 다른 글

[백준 5648번] 역원소 정렬 (C++)  (0) 2022.04.12
[백준 1431번] 시리얼 번호 (C++)  (0) 2022.04.12
[백준 11652번] 카드 (C++)  (0) 2022.04.12
[백준 1541번] 잃어버린 괄호 (C++)  (0) 2022.04.07
[백준 11660번] 구간 합 구하기 5 (C++)  (0) 2022.04.07
    'Algorithm' 카테고리의 다른 글
    • [백준 5648번] 역원소 정렬 (C++)
    • [백준 1431번] 시리얼 번호 (C++)
    • [백준 11652번] 카드 (C++)
    • [백준 1541번] 잃어버린 괄호 (C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바