时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:4096
本题知识点: Java工程师 C++工程师 测试工程师 招商银行信用卡中心 贪心
校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
题目描述
公司组织团建活动,到某漂流圣地漂流,现有如下情况:
员工各自体重不一,第 i 个人的体重为 people[i],每艘漂流船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
为节省开支,麻烦帮忙计算出载到每一个人所需的最小船只数(保证每个人都能被船载)。
输入描述:
第一行输入参与漂流的人员对应的体重数组, 第二行输入漂流船承载的最大重量
输出描述:
所需最小船只数
示例1
输入
复制
1 2 3
输出
复制
1
解题思路:
先将乘船的人的体重进行从小到大排序,然后依次从大往小取"人",每取了一个人就在标记数组中记录该人已经取过了,然后在从小到大遍历一下没有取过得"人",如果这两个人可以同时取出来然后就将该人也取出来。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[1010],limit,n,vis[1010];
int main()
{
int len=0;
while(cin>>n)
{
a[len++]=n;
if(getchar()=='\n')break;
}
cin>>limit;
sort(a,a+len);
memset(vis,0,sizeof(vis));
int flag=0;
for(int i=len-1; i>=0; i--)
{
int num=0;
if(!vis[i])
{
num+=a[i];
vis[i]=1;
int num1=0;
for(int j=0; j<len; j++)
{
if(num+a[j]<=limit&&vis[j]==0)
{
vis[j]=1;
break;
}
}
flag++;
}
}
cout<<flag<<endl;
return 0;
}