NYJO71&南阳理工oj_71(独木舟上的旅行) (贪心)

来源:互联网 发布:java中非线程安全的类 编辑:程序博客网 时间:2024/05/21 20:45

题目信息:

 一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。找出可以安置所有旅客的最少的独木舟条数.

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

       船只数


题目链接 ——> 南阳理工oj_71(独木舟上的旅行) (贪心)


题意分析:

/***************************************************************************
贪心算法,找到最优结果进行判断对数据排序,判断最大和最小的和
与w的关系,if(a[max]+a[min]<=w)则已经送走两个人(n-=2),循环最大
和最小值,(此题一船最多载两个人)用(sum)记录船数,if不满足条件,
从最小一端(min)循环,直到与max相等退出循环,sum+=n;

(初学,描述不清,请见谅)

****************************************************************************/


源代码:


#include<iostream>//贪心算法
#include<algorithm>
using namespace std;
int a[301];
int main()
{
    int t;
    cin>>t;
    while(t--){
        int w,n;
        cin>>w>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        sort(a,a+n);//排序
        int sum=0,i,j;
        i=0;j=n-1;
        while(1){
            if(j<=i){//结束循环,并判断剩余人数,
                sum+=n;
                break;
            }
            if(a[i]+a[j]<=w){//两个人一条船
                ++i;//循环下标
                n-=2;//人数减2
                sum++;//船加1
            }
            --j;//从一端进行判断,直到另一端结束
        }
        cout<<sum<<endl;
    }
    return 0;
}


0 0
原创粉丝点击