首页 > 编程语言 >贪心算法 独木舟 HZOJ

贪心算法 独木舟 HZOJ

时间:2023-01-07 22:00:57浏览次数:40  
标签:cnt int 负载量 bool HZOJ 独木舟 include true 贪心

题面:

 

解题思路:

有两个点必须记住,一条船只能做两个人,且两个人重量相加不能超过最大负载量。

因此,第一步,我们先对n个人的体重进行从小到大排序,然后从第一个开始,如果第一个可以装的下且小于最大负载量,则向后搜寻小于等于剩下重量空余承重的最大值作为与第一个坐同一艘船的人。设置一个bool类型数组把n个未上船的人的值置为true(初始化为true),然后已经上船的就置为false。然后向后进行,循环结束所有人都上了船,用count记录船数。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <queue>
using namespace std;
int w,n;
int a[30005];
bool b[30005];
int Greedy(int a[],bool b[],int n,int w){
    sort(a,a+n);
    int cnt=0;
    for(int i=0;i<n;i++){
        if(a[i]<=w&&b[i]==true){
            int m=w-a[i];
            for(int j=i+1;j<n;j++){
                if(j==n-1&&a[j]<=m){//解决最大值是最后一个的情况 
                    b[j]=false;
                    break;
                }
                if(a[j]<=m&&a[j+1]>m){
                    b[j]=false;
                    break;
                }
            }
        cnt++;
        }
    }
    return cnt;
}
int main(){
    cin >> w >> n;
    for(int i=0;i<n;i++){
        cin >> a[i];
        b[i]=true;
    }
    cout << Greedy(a,b,n,w);
    return 0;
}

法二:

#include<bits/stdc++.h>
using namespace std;
int main(){

  int w,n,cnt=0,l=1,r,a[1001];//边界条件l=1,r=n
  scanf("%d%d",&w,&n);
  for(int i=1;i<=n;i++){
   scanf("%d",&a[i]);
  }
  sort(a+1,a+n+1);
  r=n;
  while(l<=r){
   if(a[l]+a[r]<=w){//如果两人体重小于船的载重cnt++
    cnt++;
    l++;//边界相应缩小
    r--;
   }else{
    cnt++;
    r--;
   }
  }
  printf("%d\n",cnt);

 return 0;
}

 

标签:cnt,int,负载量,bool,HZOJ,独木舟,include,true,贪心
From: https://www.cnblogs.com/anaxiansen/p/17033642.html

相关文章

  • 【NOI2019】序列 题解(贪心模拟费用流)
    (感觉是有史以来自己代码最好看的一次贪心模拟费用流。LG传送门Solution1经过一番思考,不难发现我们可以根据题面建图跑费用流。具体见下图:(从@cmd大佬那里薅来的。)然......
  • 「贪心&优先队列」数列极差
    本题为12月30日22寒假集训每日一题题解题目来源:(未知)题面题目描述佳佳的老师在黑板上写了一个由n个正整数组成的数列,要求佳佳进行如下操作:每次擦去其中的两个数a和......
  • 记录一道贪心+差分的题目
    由于差分这个知识点经常会被本人忘记,可能是做的题目太少了没怎么碰到。。。因此记录一道贪心加上差分的题目。本题为第十三届蓝桥杯省赛C++C组题目:4655.重新排序具体思......
  • Least Prefix Sum(贪心)
    题目链接题目描述:Baltic,afamouschessplayerwhoisalsoamathematician,hasanarray\(a_1,a_2,…,a_n\),andhecanperformthefollowingoperationsevera......
  • 贪心算法Dijkstra
    Dijkstra最短路径问题:给定一个带权有向图G=(V,E,W),同时给定一个源点u(u∈V),我们要找出从源点u出发到其它各点的最短路径距离,并得出这些最短路径的具体路径......
  • 【排序贪心】【字符串】LeetCode 179. 最大数
    题目链接179.最大数思路转自宫水三叶大佬的题解对于nums中的任意两个值a和b,我们无法直接从常规角度上确定其大小/先后关系。但我们可以根据「结果」来决定a和......
  • HZOJ 切割回文 动态规划
    题面: 解题思路:本题是一个经典的动态规划的题目。定义动态规划数组dp,dp[i]的含义是子串str[0…i]至少需要切割几次,才能把str[0…i]全部切成回文子串。那么dp[len-1]......
  • Codeforces Round #690 (Div. 3) E1. Close Tuples (easy version) (贪心+思维)
    https://codeforces.com/contest/1462/problem/E1E1.CloseTuples(easyversion)题目大意:给定一个长度为n的序列a,由1到n的整数组成,某些元素可能相等。找出m=3个元......
  • 程序设计基础(二)—— 贪心
    引入:贪心算法(greedyalgorithm),是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪,每一步行动总是按某种指标选取最优的操作。即为当前解为局部最优解可想......
  • HZOJ 传纸条 动态规划
    题面: 解题思路: 用一个三维的数组来记录,dp[b][x1][x2],b表示走的步数,表示两条路径上的某个点的横纵坐标相加之和,x1表示第一条路的某一点的横坐标,y1表示第一条路的某一......