看了这个题目名字你是不是很不屑
“贪心打水啊,经典题目,谁不会啊”
那我想说你错了。这个题如果是简单的贪心打水怎么会坑了我和XXY神犇一上午(╯‵□′)╯︵┻━┻
题目描述 Description
}
90分代码
改变了一下策略,用一个变量记录下每一次的最小值,然后就能AC了owo
不过根据XXY神犇提供的反例,这个题并不能贪心,只不过数据比较弱所以贪心一样A了。
不管怎么样,这个diamond题目就此解决。
“贪心打水啊,经典题目,谁不会啊”
那我想说你错了。这个题如果是简单的贪心打水怎么会坑了我和XXY神犇一上午(╯‵□′)╯︵┻━┻
题目描述 Description
你和你的同学们在体育馆里练习,总共有 n 个人。这时大家口渴了,想要喝水。体育馆里
没有打水的地方,于是大家找到了周边的一家饭店,里面有 m 个相同的水龙头可供打水。
在这里,同一个水龙头在同一时间只能供一个人打水,第 i 个人打水所花的时间为 t[i]。
由于店老板按时间收费,所以请你求出所有人打完水所花的最小时间(水龙头的切换时间
忽略不计)。
输入描述
Input Description
第一行,n 和 m。
第二行,共 n 个数,分别是 t[1]到 t[n]。
输出描述
Output Description
第一行,一个数,即所有人打完水所花的最小时间。
样例输入
Sample Input
16 7
1 2 3 3 4 4 5 5 5 6 7 8 9 9 10 10
样例输出
Sample Output
13
数据范围及提示
Data Size & Hint
【输入输出解释】
(描述格式为 水龙头号码:在这里打水的每个人所花的时间)
1:1+5+7=13
2:2+5+6=13
3:3+10=13
4:3+10=13
5:4+9=13
6:4+9=13
7:5+8=13
【数据范围】
对于 30%的数据,n<=10,000,m<=1,000;
对于全部的数据,1<=n<=1,000,000,1<=m<=100,000。
没错看到这里你就明白了
这个题目坑就坑在数据范围(╯‵□′)╯︵┻━┻
标准标签给的是堆优化然后做
XXY神犇也果断的选择了堆优化
至于我这种手残的。。。朴素贪加一点优化吧
本来就没想过要A的,还准备去问XXY代码
没想到
优化之后一次AC了!
AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int t[1000001];
int ans;
int num=0;
int work[100001];
int x;
main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&t[i]);
sort(t+1,t+n+1);
int i=n;
while (i>=1)
{
num++;
if (num==m+1)
{
int k=*min_element(work+1,work+m+1);
num=1;
ans+=k-x;
x=k;
}
if (work[num]-x==0)
{
work[num]+=t[i--];
}
}
ans+=*max_element(work+1,work+m+1)-x;
cout<<ans;
}
90分代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int t[1000001];
int ans;
int num=0;
int work[100001];
int x;
main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&t[i]);
sort(t+1,t+n+1);
int i=n;
while (i>=1)
{
num++;
if (num==m+1)
{
int k=*min_element(work+1,work+m+1);
num=1;
ans+=k-x;
x=k;
}
if (work[num]-x==0)
{
work[num]+=t[i--];
}
}
ans+=*max_element(work+1,work+m+1)-x;
cout<<ans;
改变了一下策略,用一个变量记录下每一次的最小值,然后就能AC了owo
不过根据XXY神犇提供的反例,这个题并不能贪心,只不过数据比较弱所以贪心一样A了。
不管怎么样,这个diamond题目就此解决。