题目链接:http://codeforces.com/problemset/problem/965/C
题意:k个人围成一个圈分n个糖, 选择一个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<bits/stdc++.h> 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; }
