挑水

【题目描述】

新时代优秀的挑水工的你,工作责任就是在停水的时候,为"爱心"社区的居民们挑水,保证大家的日常生活的正常维持。

"爱心"社区一共\(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;
}
posted @ 2025-07-27 17:30  yangmengcheng1103  阅读(14)  评论(0)    收藏  举报