Yukari's Birthday HDU

来源:互联网 发布:关于网络暴力的演讲稿 编辑:程序博客网 时间:2024/06/03 09:27

题目传送门

题意:将蛋糕分作r个同心圆,圆心可以放一个或者不放蜡烛,然后同心圆从内到外,第i个同心圆放k^i个蜡烛,问r*k最小的时候,r,k的值分别是多少,r*k相同时,输出r最小的情况。

思路:这个题其实很水,但是比赛的时候头脑十分的不清晰,自己写了一个暴力的程序,结果一直在超时,赛后看了一下题解发现这个题目使用二分来解决的,枚举各种r的情况,因为r不会特别大限制在40多就可以也不会超时,然后二分加枚举就可以做出来了。

#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <fstream>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <string>#include <vector>#define MAXN 1000010#define INF 10000000#define MOD 1000000007#define LL long longusing namespace std;LL n;LL Bisection(LL s) {  LL left = 2, right = n + 10;  LL mid = (left + right) / 2;  while (left <= right) {    mid = (left + right) / 2;    LL ans = 1;    LL sum = 0;    for (LL i = 1; i <= s; ++i) {      if (n / ans < mid) {        sum = n + 1;        break;      }      ans *= mid;      sum += ans;      if (sum > n)        break;    }    if (sum == n - 1 || sum == n)      return mid;    else if (sum < n - 1)      left = mid + 1;    else      right = mid - 1;  }  return -1;}int main() {  std::ios::sync_with_stdio(false);  while (cin >> n) {    LL left = 1, right = n - 1;    for (LL i = 2; i <= 45; ++i) {      LL num = Bisection(i);      if (num != -1 && num * i < left * right) {        left = i;        right = num;      }    }    cout << left << " " << right << endl;  }  return 0;}
原创粉丝点击