hihocoder的hiho一下,第256周的题目
传送门:https://hihocoder.com/contest/hiho256/problem/1
时间限制:10000ms 单点时限:1000ms 内存限制:256MB
描述
There are N jobs to be finished. It takes a robot 1 hour to finish one job.
At the beginning you have only one robot. Luckily a robot may build more robots identical to itself. It takes a robot Q hours to build another robot.
So what is the minimum number of hours to finish N jobs?
Note two or more robots working on the same job or building the same robot won’t accelerate the progress.
输入
The first line contains 2 integers, N and Q.
For 70% of the data, 1 <= N <= 1000000
For 100% of the data, 1 <= N <= 1000000000000, 1 <= Q <= 1000
输出
The minimum number of hours.
样例输入 10 1 样例输出 5
每个机器人有两个选择:1.造机器人2.做任务;造一个机器人用时Q,如果总任务数平均到当前机器人,要花的时间超过了2Q,那么这个机器人就应该选择再造一个机器人。
但是,是不是会出现一部分机器人造人,另一部分做任务的情况呢? 好像这边有这种情况 的 话,总的最短用时还是不变的? 这里边有点复杂,没想明白,先按都一起复制,复制完了一起加工来看吧。
#include <iostream> #include <cmath> int main(int argc, char** argv) { int n, q; scanf("%d %d", &n, &q); // 首先计算需要复制几次 int k = ceil(log((double)(n/(2*q))) / log(2)); // 再计算用时 int ans = k*q + ceil((double)(n/(pow(2, k)))); printf("%d\n", ans); return 0; }但是通过情况为WA,60/100 遂改了一下:
int main(int argc, char** argv) { long long int n; int q; scanf("%lld %d", &n, &q); // 首先计算需要复制几次 long long int k = ceil(log((double)(n/(2*q))) / log(2.0)); // 再计算用时 long long int ans = k*q + ceil((double)(n/(pow(2.0, k)))); printf("%lld\n", ans); return 0; }这次变成80/100了 又改了一下:
int main(int argc, char** argv) { long long int n; int q; scanf("%lld %d", &n, &q); // 首先计算需要复制几次 long long int m=1,k=0; while(n > 2*m*q)//根据结论,机器人应当全部复制 { m *= 2; k++; } // 再计算用时 long long int ans = k*q + ceil((double)(n/(pow(2.0, k)))); printf("%lld\n", ans); return 0; }https://www.cnblogs.com/ECJTUACM-873284962/p/7136061.html 【这里边包括了一部分机器人在复制,其他机器人在工作这种情况不用考虑的相关证明】