jason


私信TA

用户名:yisj0323

访问量:7953

签 名:

c++题刷起来

等  级
排  名 217
经  验 6354
参赛次数 18
文章发表 67
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

我喜欢用”a,b,c,d,i,j,k,l,x,y“大家请习惯。

解题思路:


此题应运用二分答案
1.输入n,k;
2.输入每条网线的长度(给每个网线乘100变成整数);
3.在写一个while循环进行二分答案;
先定义两个数l,r分别代表最小值和最大值;
然后再循环内定义mid表示最小值和最大值的平均数;
在定义一个数z,表示网线可以分成多少段;
用一个for循环来计算网线可分成几段;
再用if语句来比较z和k(现在网线分成的几段和想得到的网线长度作比较);
如果z<k则r=中间数-1;
否则l=中间数+1;
4.循环结束后r=r/100(表示答案);
5.最后输出

注意事项:

1.数组,l,r都需定义成double类型;
2.记住要给每个网线乘100变成整数;


参考代码:

#include<bits/stdc++.h>
using namespace std;
int n,k;double a[1000005];
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];a[i]*=100;
	}
	double l=1,r=10000000;
	while(l<=r){
		int mid=(l+r)/2;
		int z=0;
		for(int i=1;i<=n;i++)z+=a[i]/mid;
		if(z<k) r=mid-1;
		else l=mid+1;
	}
        r/=100;
	cout<<fixed<<setprecision(2)<<r;
	return 0;
}


 

0.0分

2 人评分

  评论区

  • «
  • »