CodeForces - 965C Greedy Arkady

1336 단어 Codeforces
제목 링크:http://codeforces.com/problemset/problem/965/C
제목:k 명 이 한 바퀴 에 n 개의 설탕 을 나 누고 x 를 선택 하 며 첫 번 째 사람 부터 하나씩 x 개의 설탕 을 얻 고 나머지 는 x 개가 부족 할 때 까지 x 개의 설탕 을 얻는다.첫 번 째 사람 이 얼마나 받 을 수 있 는 지.
요구 x 는 M 보다 작 으 며,한 사람 당 마지막 D*X 개 입 니 다.
생각:
Xmax = M, Xmin = n / (D * k + 1) + 1;
ans = (n/x/k + n/x%k == 0 ? 0 : 1) *x
n/x 는 일정한 범위 내 에서 괄호 안의 값 이 변 하지 않 고 x 의 값 과 만 관련 이 있 기 때문에 매 거 진 n/x 를 시도 할 수 있 습 니 다.
#include

using namespace std;

int main()
{
    long long n, k, M, D;
    cin >> n >> k >> M >> D;
    long long Max, Min, ans = -1, sym;
    Max = M;
    Min = n / (D * k + 1) + 1;
    if(Max < Min)
    {
        cout << Max << endl;
    }
    else if(Max == Min)
    {
        long long tmp = n / Max;
        cout << (tmp / k + (tmp % k == 0 ? 0 : 1)) * Min << endl;
    }
    else
    {
        sym = Max;
        while(sym >= Min)
        {
            long long tmp = n / sym;
            ans = max((tmp / k + (tmp % k == 0 ? 0 : 1)) * sym, ans);
            if(tmp % k == 0)
            {
                tmp++;
            }
            else
            {
                tmp = (tmp / k + 1) * k;
            }
            sym = n / tmp;
        }
        cout << ans << endl;
    }
    return 0;
}

좋은 웹페이지 즐겨찾기