#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <math.h>
#include <vector>
using namespace std;
 
long long N, C;
long long house[200010];
 
long long cal(long long mid)
{
    long long cnt = 1;
    int beforeWifi = 1;
    
    for(int i = 2; i <= N; i++)
    {
        if(house[i] - house[beforeWifi] >= mid)
        {
            cnt++;
            beforeWifi = i;
        }
    }
    
    return cnt; 
}
 
int main(void)
{
//    freopen("B2110_input.txt", "r", stdin);
 
    cin >> N >> C;
    
    for(int i = 1; i <= N; i++)
    {
        cin >> house[i];
    } 
    sort(house+1, house+N+1);
    
    long long left = 1;
    long long right = house[N]-house[1];
    long long Max = 0;
    
    while(left <= right)
    {
        // 공유기 사이의 거리 
        long long mid = (left + right) / 2;
        
        // 설치한 공유기 수 
        long long wifi = cal(mid);
        
        if(wifi >= C)
        {
            if(Max < mid)
            {
                Max = mid;
            }
            
            left = mid+1;
        }
        else if(wifi < C)
        {
            right = mid-1;
        }
    }
    
    cout << Max;
 
    return 0;
}
cs
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <math.h>
#include <vector>
using namespace std;
 
long long N;
long long total;
long long budget[10010];
 
long long cal(long long mid)
{
    long long sum = 0;
    
    for(int i = 1; i <= N; i++)
    {
        if(budget[i] <= mid)
        {
            sum += budget[i];
        }
        else
        {
            sum += mid;
        }
    }
        
    return sum;
}
 
int main(void)
{
//    freopen("B2512_input.txt", "r", stdin);
 
    cin >> N;
    
    for(int i = 1; i <= N; i++)
    {
        cin >> budget[i];
    }
    sort(budget+1, budget+N+1);
    
    cin >> total;
    
    long long left = 1;
    long long right = budget[N];
    long long Max = 0
    
    while(left <= right)
    {
        // 상한액 
        long long mid = (left + right) / 2;
        
        // 예산
        long long sum = cal(mid); 
 
        if(sum > total)
        {
            right = mid-1;
        }
        else if(sum <= total)
        {
            if(Max < mid)
            {
                Max = mid;
            }
            
            left = mid+1;
        }
    }
    
    cout << Max;
 
    return 0;
}
cs
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <math.h>
#include <unordered_map>
#include <vector>
using namespace std;
 
long long A, B, V;
 
int main(void)
{
//    freopen("B2869_input.txt", "r", stdin);
 
    cin >> A >> B >> V;
    
    long long left = 1;
    long long right = V;
    long long Min = 1111111111;
    
    while(left <= right)
    {
        // 날짜 
        long long mid = (left + right) / 2;
 
        if(A * mid - B * (mid-1>= V)
        {
            
            if(mid < Min)
            {
                Min = mid;
            }
            
            right = mid-1;
        }
        else if(A * mid - B * (mid-1< V)
        {
            left = mid+1;
        }
    }
    
    cout << Min;
 
    return 0;
}
cs
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <math.h>
#include <map>
#include <vector>
using namespace std;
 
int N, M;
long long Max;
long long tree[1000010];
 
long long cal(long long mid)
{
    long long sum = 0;
    
    for(int i = 1; i <= N; i++)
    {
        if(mid < tree[i])
        {
            sum += tree[i]-mid;
        }
    }
    
    return sum;
}
 
int main(void)
{
//    freopen("B2805_input.txt", "r", stdin);
    
    cin >> N >> M;
    
    for(int i = 1; i <= N; i++)
    {
        cin >> tree[i];
    }
    
    sort(tree+1, tree+N+1);
    
    long long left = 1;
    long long right = tree[N];
    
    while(left <= right)
    {
        // 절단기의 높이 
        long long mid = (left + right) / 2;
        
        // 자른 나무길이의 합 
        long long sum = cal(mid);
        
        if(sum >= M)
        {
            left = mid+1;
            
            if(mid > Max)
            {
                Max = mid;
            }
        }
        else
        {
            right = mid-1;
        }
    }
    
    cout << Max;
    
    return 0;
}
cs
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <math.h>
#include <map>
#include <vector>
using namespace std;
 
int K, N;
long long Max;
long long lan[10010];
 
int cal(int mid)
{
    int cnt = 0;
    
    for(int i = 1; i <= K; i++)
    {
        cnt += lan[i] / mid;
    }
    
    return cnt;
}
 
int main(void)
{
//    freopen("B1654_input.txt", "r", stdin);
    
    cin >> K >> N;
    
    for(int i = 1; i <= K; i++)
    {
        cin >> lan[i];
    }
    
    sort(lan+1, lan+K+1);
    
    long long left = 1;
    long long right = lan[K];
    
    while(left <= right)
    {
        // 랜선의 길이 
        long long mid = (left + right) / 2;
        
        // 나눈 랜선의 총 갯수 
        int divideCnt = cal(mid);
        
        if(divideCnt >= N)
        {
            left = mid+1;
            
            if(mid > Max)
            {
                Max = mid;
            }
        }
        else
        {
            right = mid-1;
        }
    }
    
    cout << Max;
    
    return 0;
}
cs

+ Recent posts