挑水
【题目描述】
新时代优秀的挑水工的你,工作责任就是在停水的时候,为"爱心"社区的居民们挑水,保证大家的日常生活的正常维持。
"爱心"社区一共\(n\)户人家 , 每家都有一口大水缸 , 第\(i\)户人家的水缸容量是\(a_i\) , 你有一副从太爷爷那里继承来的一个扁担和两个相同的木桶 , 每次停水时你都会用上它们。一个木桶的容量是 \(v\) 。因为打水的距离够远并且你每天工作时间有限,今天你只能帮助\(m\)户 , 请问你最少需要挑水多少趟才能帮助\(m\)户居民把水缸接满。
【输入格式】
第一行输入\(n\)、\(m\)和\(v\) , 表示总共\(n\)户居民 , 能帮助\(m\)户居民和木桶的容积\(v\)。
第二行输入\(n\)户居民的水缸容量 , 第\(i\)户的水缸容量是\(a_i\) , 每户用空格隔开。
【输出格式】
输出最少打水的趟数。
【输入输出样例】
| water.in | water.out |
|---|---|
| 3 2 10 40 55 22 | 4 |
【数据范围与约定】
对于\(10%\)的数据 , \(n==m==2\)
对于\(50%\)的数据 , 居民用水量按照从小到大排序
对于\(100%\)的数据 , \(1<=n,m,v,a_i<=10^4\)
【题目正确分析】
-
加粗的字体是一个陷阱,所以说要算\(v*2\),而不是\(v\)
-
算出来后向上取整即可(\(ceil(1.0*s/(2*v))\))
【我的错因】
- 把各种情况分开来算了
【错误代码】
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int v,n,m;
int main(){
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
cin>>n>>m>>v;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int ans=0;
for(int i=1;i<=m;i++){
if(a[i]%(v*2)==0){
ans+=a[i]/(v*2);
}
else if(a[i]%v==0){
ans+=a[i]/v;
}
else if(a[i]-(v*2)>=a[i]-v){
ans+=a[i]/(v*2);
}
else{
ans+=a[i]/v;
}
}
cout<<ans;
return 0;
}
【AC代码】
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
int a[100005],n,m,v,s=0;
cin>>n>>m>>v;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
for(int i=1;i<=m;i++)
s+=a[i];
int ans=ceil(1.0*s/(2*v));
cout<<ans;
return 0;
}

浙公网安备 33010602011771号