文章

5

粉丝

87

获赞

16

访问

1.1k

头像
P1141 小H的搬寝室 答疑提问:
P1141 ICPC大学生程序设计竞赛
发布于2025年3月15日 21:24
阅读数 186

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n,w,a[1000];
    cin>>n>>w;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    int tag=0,sum=0;
    for(int i=0;i<n;i++){
        if((sum+a[i])>=w){
            sum=0;
            tag++;
        }else{
            sum+=a[i];
        }
    }
    if(sum!=0) tag++;
    cout<<tag;
    return 0;
}

通过率0%,麻烦看下错在哪里

登录查看完整内容


登录后发布评论

1 条评论
admin SVIP
2025年3月15日 23:42

代码存在逻辑错误,主要问题在于判断每次搬运物品总重量是否超过最大承重 w 时出现了条件判断失误。代码中使用 (sum + a[i]) >= w 作为判断条件,这样当 sum + a[i] 恰好等于 w 时,当前物品 a[i] 就不会被算入本次搬运,而是会被错误地分到下一次搬运,从而导致搬运次数计算错误。正确的判断条件应该是 (sum + a[i]) > w,即只有当加上当前物品后总重量严格超过最大承重时,才开始新的一次搬运。
代码修改如下:
 

#include<iostream>
#include<algorithm>
using namespace std;

int main() {
    int n, w, a[1000];
    cin >> n >> w;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    // 对物品重量进行排序,确保从最轻的物品开始搬
    sort(a, a + n);
    int tag = 0, sum = 0;
    for (int i = 0; i < n; i++) {
        // 当加上当前物品后总重量超过最大承重时,开始新的一次搬运
        if ((sum + a[i]) > w) {
            sum = 0;
            tag++;
        }
        // 将当前物品加入本次搬运的总重量
        sum += a[i];
    }
    // 如果最后还有未完成的搬运,需要额外搬运一次
    if (sum != 0) tag++;
    cout << tag;
    return 0;
}

 

赞(0)