寒假快乐刷题第四天 2021-01-21

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分钟,忙碌的一天又这么结束了。
晚安,不穿衣服的派大星。

猜你喜欢

转载自blog.csdn.net/qq_52852840/article/details/112975001