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

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

 

 

 

#include "bits/stdc++.h"
using namespace std;
// 숫자 카드
int main() {
    int n, m, arr[10000], finding[10000];
    cin >> n;
    for (int i=0; i<n; i++) {
        cin >> arr[i];
    }
    sort(arr, arr + n);
    cin >> m;
    for (int i=0; i<m; i++) {
        cin >> finding[i];
    }
    for (int i=0; i<m; i++) {
        int l = 0, r = n-1;
        bool found = false;
        while (l <= r) {
            int a = (l + r)/2;
            if (finding[i] == arr[a]) {
                printf("1 ");
                found = true;
                break;
            }
            if (finding[i] > arr[a]) {
                l = a+1;
            }
            if (finding[i] < arr[a]) {
                r = a-1;
            }
        }
        if (!found) printf("0 ");
    }
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 부분수열의 합  (0) 2022.03.19
백준 - 로또  (0) 2022.03.19
백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18
백준 숨바꼭질 4 (역추적)  (0) 2022.03.14
백준 일곱 난쟁이  (0) 2022.03.14

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

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다. 랜선의 길이는 231-1보다 작거나 같은 자연수이다.

www.acmicpc.net

 

 

#include<stdio.h>

long long k;
long long Lan[20000];   //원소는 초기화 됨. 

long long div(long long len)   //len로 자르기. 
{
   long long sum = 0;
   
   for(int i=0; i<k; i++)
   {
      sum += (Lan[i]/len);
   }
   
   return sum;
}

int main(void)
{   
   long long n;
   long long max = 0;
   scanf("%lld %lld", &k, &n);
   
   for(int i=0; i<k; i++)
   {
      scanf("%lld", &Lan[i]);
      
      if(max<Lan[i])
      {
         max = Lan[i];   //최대 원소값 찾기 
      }
   }
   
   long long s = 1;
   long long e = max;   //mid의 범위를 1~최대 원소값까지로 고정. 
   long long mid;
   long long res; 
   long long res2 = -1; 

   
   while(s<=e)
   {
      mid = (s+e)/2;
      
      res = div(mid);   //res는 조각의 개수. 
      //
      if(res >= n)
      {
        if(res2 < mid) {
          res2 = mid;
        }
         s=mid+1;
      }
      
      else
      {
         e=mid-1;
      }
   }
   
   printf("%lld\n", res2);
   
   return 0;
}

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

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이가 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이

www.acmicpc.net

 

 

 

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

int main()
{
    int n,m,a[1000000]={0,},b[1000000]={0,},i,j,l,r,mid;
    scanf("%d",&m);

    for(i=0;i<m;i++)
        scanf("%d",&a[i]);
    
    scanf("%d",&n);
    for(j=0;j<n;j++)
        scanf("%d",&b[j]);

    //printf("222\n");
    sort(a,a+m);

    //printf("3333\n");
    l=0,r=m-1;
    for(j=0;j<n;j++)
    {
        while(l<=r)
        {
            mid=(l+r)/2;
            if(a[mid]==b[j])
            {
                printf("1 ");
                break;
            }
            else if(a[mid]>b[j])
                r=mid-1;
            else l=mid+1;

        }
        if(l>r) printf("0 ");
        l=0,r=m-1;
    }

    return 0;
}

+ Recent posts