【hiho一下_week256】Diligent Robots

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
【这里边包括了一部分机器人在复制,其他机器人在工作这种情况不用考虑的相关证明】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值