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;
}