2021年4月4日腾讯笔试

第四题

2021年4月4日 腾讯笔试编程题第四题
描述:
充电问题
输入:
输入t表示案例数
输入n,w分别表示手机数和充电器功率
接下来的n行输入 a[i] b[i]表示每一部手机初始电量,和每一秒消耗的电量

输出:
简单的二分问题.

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
ll t,n;
double w;
struct node{
	int a,b;
}a[maxn];
bool check(double mid){//判断是否可行
	double ans=mid*w;//总电量
	double cnt=0;
	for(int i=1;i<=n;i++){
		double x=mid*(double)a[i].b-(double)a[i].a;//每一个手机的需求
		if(ans>=x&&x>0){
			cnt+=x/w;//充电的总时间
			ans-=x;
		}else if(x<0){//如果需求为负数则不需要操作
			continue;
		}else{//无法满足,直接返回false
			return false;
		}
	}
	if(cnt>mid)return false;//如若充电事件大于mid也为false
	return true;
}
int main(){
	cin>>t;
	while(t--){
		cin>>n>>w;
		for(int i=1;i<=n;i++){
			cin>>a[i].a>>a[i].b;
		}
		double l=0,r=1e18,pos=0;
		while(l<r){//二分
			double mid=(l+r)/2.0;
			if(check(mid)){
				l=mid;
			}else{
				r=mid;
			}
			if(fabs(mid-pos)<1e-7){//当前一次的答案和本次的答案差距在1e-7之内,则精度符合要求
				pos=mid;
				break;
			}else{
				pos=mid;
			}
			
		}
		if(r==1e18){//如若最后r不变,则表示答案无限大,输出-1
			cout<<-1<<endl;
		}else{反之输出pos
			cout<<pos<<endl;
		}
		
	}	
}

第二题

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值