寒假快乐刷题第五天 2021-01-22

7:00~7:05 打卡学习

8:00~10:00 记单词

10:00~12:00 看物理习题

物理挂了的孩子就是可怜

19:40~22:40 刷题+梳理其中思路

话不多说,上题!!

问题 C: 奶牛们的杂技
描述
在我农场上有N头牛(1<=N<=50000),我想出了一个杂技特技:站到彼此上面,形成一个有一定高度的垂直堆叠,我就让这些牛来练习这个杂技,牛正在试图弄清楚它们应该在这堆奶牛中排列的顺序。每头N头牛具有相关的体重(1<=W_i<=10000)和强度(1<=S_i<=1000000000)。一头牛倒下的风险等于它身上所有牛的总体重(当然不包括它自己的体重)减去它的强度(这样一来,一头更强壮的牛的风险就更低)。你的任务是确定牛的顺序,使任何一头牛的最大风险最小化。

格式
输入格式
第1行:整数N为单行。

行2…N+1:行i+1用两个空分整数W和S描述牛。

输出格式
一个单一的整数,给出所有奶牛的最大风险,在任何优化排序,使风险最小化。

样例
样例输入 Copy
3
10 3
2 5
3 3
样例输出 Copy
2

这道题我刚开始看的时候毫无头绪,但是我把示例中的六种情况都列了出来,我发现若要使最大风险最小,那么从上到下奶牛的体重和强度的和递减。
相通了这点后做这道题就很简单了,自定义一个结构体类型iint,其中成员有W,S,T,x,y(分别用来记录该头奶牛的体重、强度、体重强度和、负荷以及摔倒风险)。在输入奶牛体重、强度的同时记录该头奶牛的体重强度和。然后再根据奶牛的体重强度和对结构体数组caw进行升序排列(此处应用快速排序,用冒泡排序会超时)。
再对排完序的数组caw中的元素x(负荷)进行计算(此处需用到前缀和),并根据负荷算出每头牛的摔倒风险。最后再遍历caw找出最大的风险值。
代码如下:

#include<stdio.h>

struct A
{
    
    
    long long W,S,T,x,y;
};
typedef struct A iint;

void fun(iint a[],int l,int r)
{
    
    
    int i,j,k;
    iint t;
    i=l,j=r;
    while(i<j)
    {
    
    
        k=a[i].T;
        while(i<j)
        {
    
    
            while(i<j&&a[j].T>=k)
                j--;
            while(i<j&&a[i].T<=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 N;
    long long max;
    iint caw[50010],temp;
    scanf("%d",&N);
    for(int i=0; i<N; i++)
    {
    
    
        scanf("%lld%lld",&caw[i].W,&caw[i].S);
        caw[i].T=caw[i].W+caw[i].S;
    }
    fun(caw,0,N-1);
    for(int i=0; i<N; i++)
    {
    
    
        if(i==0) caw[i].x=0;
        else caw[i].x=caw[i-1].x+caw[i-1].W;
        caw[i].y=caw[i].x-caw[i].S;
    }
    for(int i=0; i<N; i++)
    {
    
    
        if(i==0) max=caw[i].y;
        else max=(max>caw[i].y)?max:caw[i].y;
    }
    printf("%lld\n",max);
}

问题 G: 生日派对分饼
描述
在我的生日派对上有N个饼,每个饼的大小不同,有许多朋友来参加我的生日派对,他们每一个人都得到了一块饼,如果其中有一个的饼比另一个人的大,他们就会抱怨,所以所有的饼应该分成相同的大小,当然了,我自己也要一块饼,而且那块也应该是同样的大小,我们所有人可能得到的最大尺寸的饼是多少?我做的饼都是圆柱形的,高度都是1,但是半径可以不一样。

格式
输入格式
一行为正整数:测试用例的组数

然后对于每个测试用例:一行带有两个整数N,F带有1<=N,F<=10000表示饼的数目和好友的数目。

一行N个整数ri,1<=ri<=10000:饼的半径。

输出格式
对于每个测试用例,输出一行具有最大可能的数值,这样我和我的朋友都可以得到一块大小为V的饼。答案应该以浮点数给出,绝对误差最多为10^(-7)保留6位小数。

样例
样例输入 Copy
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2
样例输出 Copy
25.132741
3.141593
50.265482
提示
注意精度问题
这道题其实就是昨天那道切绳子的题的套娃题,没啥挑战性,但我还是错误50%了四五次才过,原因是Π的精度不够,淦
代码如下:

#include<stdio.h>
/*
#include<math.h>
#define PI acos(-1.0)
*/
#define PI 3.141592653589793238462
void main()
{
    
    
    int T;
    scanf("%d",&T);
    while(T--)
    {
    
    
        int N,F,j=0;
        double a[10010],l=0,r=1000000000,mid,x;
        scanf("%d%d",&N,&F);
        for(int i=0; i<N; i++)
            scanf("%lf",&a[i]),a[i]=a[i]*a[i]*PI/*,printf("%lf\n",a[i])*/;
        while(j<100)
        {
    
    
            j++;
            mid=(l+r)/2;
            int count=0;
            for(int i=0; i<N; i++)
                count+=(int)(a[i]/mid);
            //printf("mid=%lf count=%d\n",mid,count);
            if(count>=F+1) x=mid,l=mid+0.0000001;
            else r=mid-0.0000001;
        }
        printf("%.6lf\n",x);
    }
}

总计学习7小时
好嘞,今天的学习就这么结束了,感冒了有点不太舒服,晚安吧,各位。

猜你喜欢

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