본문 바로가기
카테고리 없음

[백준] 7795 먹을 것인가 먹힐 것인가 c++

by 오오오니 2022. 9. 27.

이분탐색을 생각 못했고 그냥 완전 탐색하면 되는거 아닌가 했었다.

태그 안보고 푸는 연습을 해야될 것 같다.

A와 B를  정렬하고

A벡터의 각 자리의 값하고 같아지는 B의 인덱스를 구하고 ans를 더해주면 된다.

A보다 작은 것의 개수를 구하는 것인데 벡터가 0부터 시작하기 때문에 인덱스를 더해주면된다.

A의 매 자리 마다 low를 0으로 초기화 해주는 것하고 low를 그대로 두는 것하고 시간 차이가 난다.

A의 i+1자리에 있는 수는 i에 있는 수보다 크기 때문에,

A[i]에서 구한  low 인덱스보다 작거나 같은 인덱스에 있는 B의 수는 항상 A[i+1]보다 작다.

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

 

#include<iostream>
#include<vector>
#include<algorithm>


using namespace std;

int main()
{
	int T;
	int N, M,temp;
	cin >> T;
	while (T--) {
		
		cin >> N >> M;
		vector<int>A;
		vector<int>B;
		for (int i = 0; i < N; i++)
		{
			cin >> temp;
			A.push_back(temp);
		}

		for (int i = 0; i < M; i++)
		{
			cin >> temp;
			B.push_back(temp);
		}
		sort(A.begin(), A.end());
		sort(B.begin(), B.end());
		
		int ans = 0;
		int low = 0;
		for (int i = 0; i < N; i++) {
			int  high = B.size() -1, mid;
			while (low <= high)
			{
				mid = (low + high) / 2;
				if (B[mid] < A[i])
				{
					low = mid + 1;
				}
				else 
				{
					high = mid - 1;
				}
				
			}
			ans += (low);
		
		}
		cout << ans << endl;
		ans = 0;

	}
}