题目链接
简单的贪心算法,虽然我仍没体会到贪心体现在哪里,“一条独木舟最多只能乘坐两个人”,开始没注意这个条件,心想着背包问题,找不出思路。于是借鉴的网上的思路自己写的代码。
题目思路: 先把各个人的体重排序,然后计算最重的人和最轻的人能否同乘一条舟,如果不能,则最重的人就要单独乘坐一条舟,再求最轻的和第二重的人的和,依次比较。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int s,w,n,a[310];
scanf("%d",&s);
while(s--)
{
scanf("%d %d",&w,&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);//快排易错点,从标号为1的位置到标号为n+1的位置,一共个n个元素
// for(int i=1;i<=n;i++)
// printf("%d ",a[i]);
int j=1,k=n,ans=0;
while(j<k)
{
if(a[j]+a[k]<=w)
{
ans++;
j++;
k--;
}
if(a[j]+a[k]>w)
{
ans++;
k--;
}
}
if(j==k)
ans++;
printf("%d\n",ans);
}
return 0;
}