题目大意:
1/2/3/4分组,一辆出租车最多乘坐4人,问最少需要几辆车。
思路:
一、数学解法
4单独需要一辆
3和1尽可能多的搭配
两个1 和 一个 2 搭配
两个2 自行搭配
四个1 自行搭配
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
int n;
int x;
cin>>n;
int ans = 0;
int num1=0,num2=0,num3=0;
while(n--){
cin>>x;
if (x==1) {
num1++;
}
if (x==2) {
num2++;
}
if (x==3) {
num3++;
}
if (x==4) {
ans++;
}
}
if (num3 >= num1) {
ans += num3;
ans += ((num2+1)/2);
}
if (num3<num1) {
ans += num3;
num1 = num1 - num3;
ans += (num2/2);
num2 = num2%2;
if (num2==1) {
ans += (num1+1)/4+1;
}
if (num2==0) {
if (num1>0) {
ans += (num1-1)/4+1;
}
if (num1==0) {
}
}
}
cout << ans << endl;
return 0;
}
二、贪心模拟:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
const int maxn = 1e5 + 5;
int n = 0, tmp = 0;
int a[maxn];
long long ans = 0;
bool cmp(int c, int b) {
return c > b;
}
int main() {
cin >> n;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n, cmp);
for(int i = 0; i < n; i++) {
tmp = (a[i] + a[n - 1]);
if(tmp <= 4) {
ans++;
n--;
while(tmp + a[n - 1] <= 4) {
tmp += a[n - 1];
n--;
}
}
else ans++;
}
cout << ans << endl;
return 0;
}