贪心入门——独木舟

问题

  n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?

输入

第一行包含两个正整数n (0<n<=10000)和m (0<m<=2000000000),表示人数和独木舟的承重。
接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体重不超过m。

输出

一行一个整数表示最少需要的独木舟数。

输入示例

3 6
1
2
3

输出示例

2

算法代码
/**
    独木舟问题
    将人的体重降序排序
    最重的和最轻的人一起坐(i++,j--)
    否则 重的人单独坐一条船
**/

#include <iostream>
using namespace   std;

void Sort(long long a[],long n);
int ShipNum(long long a[],long n,long long shipweight);

long long weight[10000]={0};

int main()
{
    int num = 0;
    long long shipweight=0;
    cin>>num>>shipweight;

    int i=0;
    for(i=0;i<num;i++)
    {
        cin>>weight[i];
    }
    Sort(weight,num);
   cout<<ShipNum(weight,num,shipweight<<endl;
return 0;

}

void Sort(long long a[],long n)
{
    int i = 0,j = 0;
    long long temp = 0;
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[i] < a[j])
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
}

int ShipNum(long long a[],long n,long long shipweight)
{
    long i=0,j=n-1;
    int shipnum = 0;
    while(i <= j)
    {
        if((a[i]+a[j]) <= shipweight)
        {
            shipnum++;
            i++;
            j--;
        }
        else
        {
            shipnum++;
            i++;
        }
    }
    return shipnum;
}

				
时间: 2024-11-10 01:28:19

贪心入门——独木舟的相关文章

贪心入门——活动安排问题

贪心入门的几个例题来自51nod 问题描述 有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9) 输出 输出最多可以选择的线段数量. 输入示例 3 1 5 2 3 3 6 输出示例 2 求解思路 按照活动的结束时间早的优先 算法代码 #include <

[贪心入门]活动安排问题之二

有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? 分析:能否按照之一问题的解法,每个教室安排尽可能多的活动,即按结束时间排序,再贪心选择不冲突的活动,安排一个教室之后,剩余的活动再分配一个教室,继续贪心选择…… 反例: A:[1,2)  B:[1,4) C:[5,6) D:[3,7) 已经按结束时间排好顺序,我们会选择教室1: A C教室2:  B教室3:  D需要3个教室.但是如果换一种安排方法,我们可以安排AD在一个教室,而BC在

[贪心入门]活动安排问题

有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 分析: 我们就是想提高教室地利用率,尽可能多地安排活动.考虑容易想到的几种贪心策略: (1) 开始最早的活动优先,目标是想尽早结束活动,让出教室.然而, 这个显然不行,因为最早的活动可能很长,影响我们进行后面的活动.例如活动开始和结束时间分别为[0, 100), [1,2) ,[2, 3), [3, 4),[4,5],安排[0,100)的这个活动之后,其他活动无法安排,可是最优解是安排

[HDU2037]贪心入门

今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 43909    Accepted Submission(s): 23436 Problem Description “今年暑假不AC?”“是的.”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也

POJ3614 Sunscreen 贪心入门

题目大意 给出一些区间和一些点,一个点如果在一个区间内,那么此两者可以匹配.问匹配数最大是多少. 题解 这样的题我们一般都是站在区间上去找与其配对的点.我们可以得到如下性质: 对于一段区间\([l_1,r_1]\)的任意两点\(a,b, a<b\),它们对于任意一个区间\([l_2,r_2],l_2<l_1\),\(a\in[l_2,r_2]\)的可能性(以后用P表示)\(P(a\in[l_2,r_2])>P(b\in[l_2,r_2])\). 什么叫"可能性大"呢?

hdu 1009 贪心入门

Mycode: compile error,i don't know why? #include <iostream> #include<algorithm> #include<cstdio> #define maxn 10005 using namespace std; struct room { int j; int f; double val; }; struct room r[3001]; bool compare(struct room a,struct ro

贪心法_1 2016.5.16

所谓"贪心算法"是指: 在对问题求解时,总是作出在当前看来是最好的选择 也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明) 特别说明: 若要用贪心算法求解某问题的整体最优解,必须首先证明贪心思想在该问题的应用结果就是最优解!! 贪心算法不是对所有问题都能得到整体最优解 关键是贪心策略的选择,选择的贪心策略必须具备无后效性 即某个状态以前的过程不会影响以后的状态,只与当前状态有关 贪心算法的证明 贪心算法的正确性,必须有严格意义的证明,一般

贪心法_2(草稿)

51Nod贪心入门教程_任务执行顺序 有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分 最后储存计算结果需要占据O[i]个空间(O[i] < R[i]) 例如: 执行需要5个空间,最后储存需要2个空间 给出N个任务执行和存储所需的空间,问执行所有任务最少需要多少空间 分析: 本题可以抽象成,从一个整数开始,每次减去a,再加上b (a,b都是正数),要求每次操作都不产生负数 针对本题a[i] = R[i], b[i] = R[i] – O[i],注意O[i] < R[i],

贪心基础入门讲解四——独木舟问题

n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? 分析: 一个显然的策略是按照人的体重排序. 极端化贪心策略,最重的人要上船——如果最重的人和最轻的人体重总和不超过船的承重,则他们两个占用一条船.否则(因为假设最重的人的体重也不超过船的承重了),最重的人单独占一条船.转变为(n – 1)或者(n – 2)的问题了. 关键在于这种贪心策略是正确的.我们可以证明,最优解也可