牛客网 D.applese的生日 贪心++

6 篇文章 0 订阅
5 篇文章 0 订阅

D.applese的生日

链接:https://www.nowcoder.com/acm/contest/80/D
来源:牛客网

题目描述

  最可爱的applese生日啦,他准备了许多个质量不同的蛋糕,想请一些同学来参加他的派对为他庆生,为了不让一部分同学感到不爽,他决定把每个蛋糕都分割成几份(也可以不分割),使得最小的蛋糕的质量与最大的蛋糕的质量的比值不小于一个值。但是applese的刀功并不是很好,所以他希望切尽量少的刀数使得所得到的蛋糕满足条件。由于applese为了保证每一块蛋糕的质量和期望的没有偏差,所以他一刀只能切下一块蛋糕,即将一块蛋糕分成两块,同时,他不能一刀同时切两块蛋糕,也就是说,applese一次只能将一块蛋糕分割成两块指定质量的蛋糕,这两块蛋糕的质量和应等于切割前的蛋糕的质量。Applese还急着准备各种派对用的饰品呢,于是他把这个问题交给了你,请你告诉他至少要切割几次蛋糕

输入描述:

第一行包括两个数T,n,表示有n个蛋糕,最小的蛋糕的质量与最大的蛋糕的质量的比值不小于T
接下来n行,每行一个数wi,表示n个蛋糕的质量

输出描述:

输出包括一行,为最小切割的刀数
数据保证切割次数不超过500
示例1

输入

0.99 3
2000 3000 4000

输出

6

备注:

0.5 < T < 1
1 <= n <= 1000
1 <= wi <= 1000000


//世界是完美的
//每块蛋糕切成相同的部分
//不断更新最大值最小值
//b[maxx_x]=a[maxx_x]/(cut[maxx_x]+1);  全文的精髓

#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
double a[maxn];
int cut[maxn];
double b[maxn];
int main()
{
    double k;
    int tot=0;
    int n;
    int maxx_x=-1,minn_x=-1;
    double maxx_y=-1,minn_y=1000006;
    scanf("%lf%d",&k,&n);
    for(int i = 1;i <= n;i ++)
	{
        scanf("%lf",&a[i]);
        cut[i]=1;
        b[i]=a[i];
        if(a[i]<minn_y)
        {
            minn_y=a[i]; //最小值
            minn_x=i;   //最小值坐标
        }
        if(a[i]>maxx_y)
        {
            maxx_y=a[i]; //最大值
            maxx_x=i;   //最大值坐标
        }
    }
    while((minn_y/maxx_y)<k)
    {
        tot++;
        b[maxx_x]=a[maxx_x]/(cut[maxx_x]+1);
        cut[maxx_x]++;
        minn_y=min(minn_y,b[maxx_x]);
        maxx_y=-1;
        for(int i=1; i<=n; i++)
        {
            if(b[i]>maxx_y)
            {
                maxx_y=b[i];
                maxx_x=i;
            }
        }
    }
    printf("%d\n",tot);
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
struct node
{
    int cut;
    double sum;
    double now;
}q[maxn];
double cmp(node a,node b)
{
    return a.now>=b.now;
}
int main()
{
    double k;
    int tot=0;
    int n;
    scanf("%lf%d",&k,&n);
    for(int i = 1;i <= n;i ++)
	{
	    double a;
        scanf("%lf",&a);
        q[i].cut=1;
        q[i].sum=a;
        q[i].now=a;
    }
    sort(q+1,q+n+1,cmp);
    while((q[n].now/q[1].now)<k)
    {
        tot++;
        q[1].now=q[1].sum/(q[1].cut+1);
        q[1].cut++;
        sort(q+1,q+n+1,cmp);
    }
    printf("%d\n",tot);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值