装箱子(c++)

房间里有n个物体,每个物体i都有一个重量wi。小明有许多个承重为C的箱子。但是由于一些缘故,每个箱子最多只能装2个物体。现在小明想要用最少的数量装完这些物品。你能知道他最少能用几个箱子就能装完吗?

all :wi<=C<=1000

50分:n<=1000;

100分:n<=100000;

输入

第一行两个正整数n,C。分别表示物体的数量,和箱子的承重

第二行n个正整数$w_i$,代表物体i的重量

输出

一个正整数表示所用的箱子数

样例输入
5 9
8 5 2 7 7 
样例输出
4

考虑贪心:

按重量从小到大考虑每个物体,再选择剩下的物体中能够与当前 物体一起装上且重量最大的物

体,也就是"一轻一重"的去选择。

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int q[N];
int res;//res定义为全局变量
int main()
{
    int n, C;
    cin >> n >> C;
    for (int i = 1; i <= n; i++)
    {
        cin >> q[i];
    }
    sort(q, q + n + 1);
    int l = 1, r = n;
    while (l <= r)
    {
        if (q[r] + q[l] <= C)
        {
            r--;
            l++;
            res++;
        }
        else
        {
            r--;
            res++;
        }
    }
    cout << res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C++ 实现推箱子游戏的代码,其中用数字表示地图和物品: ``` #include <iostream> #include <vector> using namespace std; const int MAXN = 10; int n, m; int sx, sy; // 起点坐标 int ex, ey; // 终点坐标 int mp[MAXN][MAXN]; // 地图 int vis[MAXN][MAXN]; // 记录点是否访问过 vector<pair<int, int>> boxs; // 记录箱子位置 bool dfs(int x, int y) { if (x == ex && y == ey) return true; // 到达终点 if (mp[x][y] == 1 || vis[x][y]) return false; // 障碍或已访问过 vis[x][y] = 1; // 标记为已访问 for (int i = 0; i < boxs.size(); ++i) { int bx = boxs[i].first, by = boxs[i].second; if (bx == x && by == y) { // 当前位置有箱子 int nx = bx + (bx - x), ny = by + (by - y); if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue; // 超出边界 if (mp[nx][ny] == 1 || vis[nx][ny]) continue; // 障碍或已访问过 boxs[i].first = nx, boxs[i].second = ny; // 移动箱子 bool flag = dfs(x, y); // 从新位置开始搜索 boxs[i].first = bx, boxs[i].second = by; // 恢复箱子位置 if (flag) return true; // 可以到达终点 else continue; // 不可到达终点,继续搜索下一个箱子 } } if (x + 1 < n && !vis[x+1][y]) { // 向下搜索 if (dfs(x+1, y)) return true; } if (x - 1 >= 0 && !vis[x-1][y]) { // 向上搜索 if (dfs(x-1, y)) return true; } if (y + 1 < m && !vis[x][y+1]) { // 向右搜索 if (dfs(x, y+1)) return true; } if (y - 1 >= 0 && !vis[x][y-1]) { // 向左搜索 if (dfs(x, y-1)) return true; } return false; // 无法到达终点 } int main() { cin >> n >> m; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> mp[i][j]; if (mp[i][j] == 2) boxs.push_back(make_pair(i, j)); // 记录箱子位置 else if (mp[i][j] == 3) sx = i, sy = j; // 记录起点坐标 else if (mp[i][j] == 4) ex = i, ey = j; // 记录终点坐标 } } if (dfs(sx, sy)) cout << "Yes" << endl; else cout << "No" << endl; return 0; } ``` 该算法使用 DFS(深度优先搜索)实现,对于每个箱子位置,向四个方向搜索箱子可移动的位置,然后以新位置为起点继续搜索,直到找到终点或无法继续搜索为止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值