当前位置: 代码迷 >> 综合 >> HAUT OJ 1241: XXX班的团事活动
  详细解决方案

HAUT OJ 1241: XXX班的团事活动

热度:70   发布时间:2023-12-04 03:21:50.0

问题描述:

 一月一度的团事活动又来了,这次的活动是去郊游,可是呢,团支书立马就泼了一发冷水,说是我们的目的地在一个隔海的小岛上,需要乘独木舟才能到该小岛上,一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。并且独木舟的租费很贵,班费又有限。。我们要尽量减少这次活动中的花销,所以要找出可以安置所有学生的最少的独木舟条数,ykc真的很想去这次郊游,你能写个程序帮助他找出这个最小要租的独木舟数吗?

输入:

第一行输入s,表示测试数据的组数;
每组数据的第一行包括两个整数w,n,80<=w<=200,1<=n<=300,w为一条独木舟的最大承载量,n为人数;
接下来的一组数据为每个人的重量(不能大于船的承载量);

输出:

每组所需要租的最小独木舟数

样例输入:

3
85 6
5 84 85 80 84 83
90 3
90 45 60
100 5
50 50 90 40 6

样例输出:

5
3
3


原因分析:

先将数组从小到大排,可以选一个最大的和一个最小的组一只船,注意到最后若i=k,只剩一个人也要+1


解决方案:

#include<bits/stdc++.h>using namespace std;int  main(){int a[205];int n,w,i,t,ans,k;scanf("%d",&t);while(t--){ans=0;k=1;scanf("%d%d",&w,&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+n+1);for(i=n;i>=k;i--){if(a[i]>=w)ans++;else{while(a[i]+a[k]<=w && i>k){ans++;k++;i--;}if(a[i]+a[k]>w && i>k)ans++;if(i==k)ans++;}}printf("%d\n",ans);}}