51nod_1432_独木舟
思维题
题目链接
题目描述
n个人,已知每个人体重。独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?
Input
第一行包含两个正整数n (0<n<=10000)和m (0<m<=2000000000),表示人数和独木舟的承重。接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体重不超过m。
Output
一行一个整数表示最少需要的独木舟数。
Input示例
3 6
1
2
3
Output示例
2
解题思路
对人的重量w[]从小到大排序,i从前往后遍历,j从后往前遍历,直到会和,
w[i]+w[j]>m:给重的分配一个船,因为它不可能和其他人一起坐船了
w[i]+w[j]<=m:给两个人分配一个船
i==j:分配一个船,因为题目要求每个人的重量不超过船重
AC代码
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int main() {
int n;
ll m;
ll w[10005];
while (cin >> n >> m) {
for (int i = 0; i < n; ++i) {
cin >> w[i];
}
sort(w, w + n);
int ans = 0;
for (int i = 0,j=n-1; i<=j;) {
if (i == j) {
i++;
j--;
ans++;
}
else if (w[i] + w[j] > m) {
j--;
ans++;
}
else if (w[i] + w[j] <= m) {
i++;
j--;
ans++;
}
}
cout << ans << endl;
}
return 0;
}