【丧心病狂的贪心系列】Codevs3377打水

 看了这个题目名字你是不是很不屑
“贪心打水啊,经典题目,谁不会啊”
那我想说你错了。这个题如果是简单的贪心打水怎么会坑了我和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题目就此解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值