2021寒假快乐刷题第四天
7:00~7:05 打卡学习
9:00~12:00 复习大物(物理挂了)
延续这个悲伤的故事。
19:30~23:40 刷题
问题 A: 切绳子
描述
有n条绳子,长度分别为L[i]。如果从他们中切割出k条长度相同的绳子的话,这k条绳子每条最长能有多长?(答案保留小数点后两位(直接舍掉两位后的小数),规定1单位长度的绳子最多可以切割成100份)
格式
输入格式
包含多组输入
输入n,k,(1<=n,k<=10000)
然后n行,输入L[i],代表每一条绳子的长度(1<=L[i]<=100000)
输出格式
切出k条长度相等的绳子最大长度是多少,输出保留两位小数
样例
样例输入 Copy
4 11
8.02
7.43
4.57
5.39
样例输出 Copy
2.00
信息
ID 问题 A
提交 369
解决 65
时间限制 1 Sec
内存限制 128 MB
命题人 2017401119
#include<stdio.h>
double x;
void fun(double a[],double l,double r,int n,int k,int j)
{
if(j==100) return ;
int count=0;
double mid=(l+r)/2;
//mid=((double)((int)(mid*100)))/100;
for(int i=0; i<n; i++)
count+=(int)(a[i]/mid);
//printf("mid=%lf count=%d\n",mid,count);
if(count==k) x=mid;
if(count>=k) fun(a,mid,r,n,k,j+1);
if(count<k) fun(a,l,mid,n,k,j+1);
}
void main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
int i=0;
double L[10010],l=0,r=999999;
for(i=0; i<n; i++)
scanf("%lf",&L[i]);
fun(L,l,r,n,k,0);
x=(double)((int)(x*100))/100;
printf("%.2lf\n",x);
}
}
这道题的坑在于因为题目限制了答案得精确到小数点后两位,所以出现处理精度不足的问题,还有我习惯上的问题,经常把double的格式符打成“%llf”,于是找了一个多小时才发现是这里的问题,引以为诫,下次不要再犯这样的错误。
问题 B: 如何放牛
描述
农夫有n个牛栏,m头牛,然后要让你把m个牛都放进牛栏里,让两头牛之前的最大的最小距离
格式
输入格式
多组输入
输入n,m (1<=m<=n<=100000)
下面n行是牛栏的位置xi (0 <= xi <= 1,000,000,000)
输出格式
输出两头牛最大的最小距离
样例
样例输入 Copy
5 3
1
2
8
4
9
样例输出 Copy
3
提示
FJ可以将他的3头奶牛放在位置1,4和8的摊位上,最小距离为3.
#include<stdio.h>
long long a[100010];
void fun(long long a[],int l,int r)
{
int i,j,k;
long long t;
i=l,j=r;
while(i<j)
{
k=a[i];
while(i<j)
{
while(i<j&&a[j]>=k)
j--;
while(i<j&&a[i]<=k)
i++;
if(i<j) t=a[i],a[i]=a[j],a[j]=t;
}
t=a[l],a[l]=a[i],a[i]=t;
fun(a,l,i-1),fun(a,i+1,r);
}
}
void main()
{
long long n,m,count=1;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
long long min,i=0,j=0;
for(i=0; i<n; i++)
scanf("%lld",&a[i]);
fun(a,0,n-1);
/*for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");*/
min=(a[n-1]-a[0])/(m-1);
while(1)
{
count=1;
i=0;
while(i<n)
{
for(j=i+1; j<n; j++)
if(a[j]-a[i]>=min)
{
//printf("j=%lld ",j);
count++;
i=j;
break;
}
if(j>=n) break;
}
/*printf("\n")
printf("min=%lld count=%lld\n",min,count);*/
if(count>=m) break;
else min--;
}
printf("%lld\n",min);
}
}
这道题我一遍过了,但是我没有用要求的二分法去找,会用二分法做这道题的小伙伴发给代码让我开开眼。
问题 F: 插入
描述
给定一个数组A和一个目标值N,如果在数组中找到目标值则返回查找次数,如果没有则输出"NO."。
格式
输入格式
第一行数组大小
第二行数组A
第三行整数N
输出格式
输出查找的次数
样例
样例输入 Copy
4
1 3 5 6
5
样例输出 Copy
2
#include<stdio.h>
void fun(int a[],int l,int r)
{
int i,j,k,t;
i=l,j=r;
while(i<j)
{
k=a[i];
while(i<j)
{
while(i<j&&a[j]>=k)
j--;
while(i<j&&a[i]<=k)
i++;
if(i<j) t=a[i],a[i]=a[j],a[j]=t;
}
t=a[l],a[l]=a[i],a[i]=t;
fun(a,l,i-1),fun(a,i+1,r);
}
}
void main()
{
int A[10010],N,n,count=0;
while(scanf("%d",&n)!=EOF)
{
count=0;
for(int i=0; i<n; i++)
scanf("%d",&A[i]);
scanf("%d",&N);
fun(A,0,n-1);
int l=0,r=n-1,mid;
while(l<=r)
{
count++;
mid=(l+r)/2;
if(A[mid]==N) break;
else if(A[mid]>N) r=mid-1;
else l=mid+1;
}
if(A[mid]!=N) printf("NO.\n");
else printf("%d\n",count);
}
}
做过以上两道题后,这道题就不足为患,签到题一个。
总计学习7小时10分钟,忙碌的一天又这么结束了。
晚安,不穿衣服的派大星。