当前位置: 代码迷 >> 综合 >> NYOJ - 71 - 独木舟上的旅行(乘船问题)
  详细解决方案

NYOJ - 71 - 独木舟上的旅行(乘船问题)

热度:73   发布时间:2023-10-09 18:00:28.0
描述

进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅客的最少的独木舟条数。现在请写一个程序,读入独木舟的最大承载量、旅客数目和每位旅客的重量。根据给出的规则,计算要安置所有旅客必须的最少的独木舟条数,并输出结果。

输入
第一行输入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 60
样例输出
5
3
3


经典题目,题目说明一条船最多坐两个人,最多承重是m,给定n个人的体重,问最少需要多少条穿。

思路:挑出最瘦的人,判断最胖的人是否能和他坐同一条船。

1.不能,同坐一条船,那么将没有人能和他同坐一条船。那么这个最胖的只能单独坐一条船。

2.能,那么这两个同坐一条船。

这里我们只需用i和j来分别标志最瘦的和最胖的人,当最胖的坐一条船,更新j,当两人同时坐一条船时,更新i个j。

 
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int s,w,n;
int p[305];
int get_ans(int i,int j){int cnt = 0;while(i<=j){ //搜索边界 if(p[j]>(w-p[i])){//单独坐 cnt++;j--;}else{//同坐 cnt++;i++;j--;}}return cnt;
}int main(){scanf("%d",&s);while(s--){scanf("%d%d",&w,&n);for(int i=0 ;i<n ;i++){scanf("%d",&p[i]);}sort(p,p+n);//一定要先排序 printf("%d\n",get_ans(0,n-1));}return 0;
}        




??
  相关解决方案