华师一附中OI组
标题:
P1577 切绳子
[打印本页]
作者:
admin
时间:
2018-7-24 18:23
标题:
P1577 切绳子
https://www.luogu.org/problemnew/show/P1577
题目描述
有N条绳子,它们的长度分别为Li。如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位。
输入输出格式
输入格式:
第一行两个整数N和K,接下来N行,描述了每条绳子的长度Li。
输出格式:
切割后每条绳子的最大长度。
输入输出样例
输入样例#1:
4 11
8.02
7.43
4.57
5.39
输出样例#1:
2.00
说明
对于100%的数据 0<Li<=100000.00 0<n<=10000 0<k<=10000
作者:
吴语林
时间:
2018-7-25 14:15
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
using namespace std;
int n,k;
double a[10100],zuo,you;
char s[100];
long long check(double x)
{
long long all=0;
for(int i=1;i<=n;i++)
all+=floor(a[i]/x);
return all;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%lf",&a[i]),you+=a[i];
while(fabs(zuo-you)>0.0001)
{
double mid=(zuo+you)/2;
if(check(mid)>=k) zuo=mid;
else you=mid;
}
sprintf(s+1,"%.3f",zuo);
s[strlen(s+1)]='\0';
printf("%s",s+1);
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-8-28 21:38
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,k,cnt;
double a[10001],l,r,sum;
double const eps=1e-3;
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
r=sum;
while(r-l>eps)
{
cnt=0;
double mid=l+(r-l)/2.0;
if(!mid)break;
for(int i=1;i<=n;i++)cnt+=floor(a[i]/mid);
if(cnt>=k)l=mid+eps;
else r=mid-eps;
}
printf("%.2f",l);
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-8-28 21:39
黄煦喆 发表于 2018-8-28 21:38
90分程序,在进位上总有问题
作者:
倚窗倾听风吹雨
时间:
2018-9-1 13:44
黄煦喆 发表于 2018-8-28 21:39
90分程序,在进位上总有问题
可以先将所有长度乘100变为整数,就不存在进位问题了。
作者:
倚窗倾听风吹雨
时间:
2018-9-1 17:29
#include<iostream>
#include<iomanip>
using namespace std;
const int M=10010;
double l[M],ans;
int n,k,maxl;
bool judge(int x)
{
int i=1,pi=0;
for(int i=1;i<=n;i++)
{
int po=l[i];
while(po-x>=0)
{
po-=x;pi++;
}
}
if(pi>=k)return true;
else return false;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>l[i];
l[i]=l[i]*100;
maxl=max(maxl,int(l[i]));
}
int l=0,r=maxl;
while(l<r)
{
int mid=l+(r-l+1)/2;
if(judge(mid))
l=mid;
else r=mid-1;
}
ans=double(l)/100;
cout<<fixed<<setprecision(2)<<ans<<endl;
return 0;
}
复制代码
作者:
admin
时间:
2018-9-2 17:58
if(pi>=k)return true;
else return false;
其实可以写成 return pi>=k完全等价 毫无违和感
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2