60分(3和5RE求调)

P1478 陶陶摘苹果(升级版)

Wish_kazdel @ 2024-07-23 20:07:26

60分(3和5RE求调)

#include<bits/stdc++.h>  
using namespace std;  
struct apple{  
    int x,y;  
}awa[5005];  
int n,s,a,b;  
bool cmp(apple a,apple b){  
      return a.y<=b.y;  
}  
int main(){  
    cin>>n>>s>>a>>b;  
    for(int i=1;i<=n;i++){  
        cin>>awa[i].x>>awa[i].y;
    }
    sort(awa+1,awa+n+1,cmp);
    int sum=a+b,t=s;
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(awa[i].x<=sum&&t-awa[i].y>=0){
            cnt++;
            t-=awa[i].y;
        }
        if(t-awa[i].y<0)break;
    }
    cout<<cnt;
    return 0;
}

by ProgramTerminator @ 2024-07-23 20:17:08

**不喜勿喷,谢谢配合**

问题分析 结构体定义:您已经定义了一个结构体 apple 来存储苹果的高度和摘取所需的力气。这是合适的。

排序:您的代码中使用了 sort 函数对苹果进行排序,但排序的依据是 y(即摘取力气),而实际上题目要求是根据是否能摘到苹果(即高度)来优先选择。因此,排序的基准应该是苹果的总高度(椅子高度 + 陶陶手长 + 苹果高度)与摘取力气无直接关系。

但考虑到我们需要尽可能多地摘苹果,并且在力气用尽之前,我们可以先按照能否摘到苹果进行筛选,然后再考虑力气因素。不过,由于题目没有直接要求按力气排序,我们可以简化处理,只按高度排序(如果考虑椅子和手长)。

逻辑处理:在遍历苹果时,您已经检查了是否能在力气用尽之前摘到苹果,但这里有一个问题:您没有将椅子的高度和手的长度加到苹果的高度上进行比较。

数组索引:在 C++ 中,数组索引通常从 0 开始,但您从 1 开始填充数组并排序。这本身不是问题,但请确保在排序和访问数组时保持一致。

修改后的代码

这里提供一个简化和修改后的代码示例,主要修改了排序和逻辑处理部分:

cpp

include<bits/stdc++.h>

using namespace std;

struct apple {
int x, y; // x: 苹果高度, y: 摘取力气
} awa[5005];

int n, s, a, b;

bool canReach(int h) {
return h <= a + b; // 检查苹果是否可达
}

int main() {  
    cin >> n >> s >> a >> b;  
    for (int i = 0; i < n; i++) {  
        cin >> awa[i].x >> awa[i].y;  
    }  

    // 过滤出能摘到的苹果  
    vector<apple> reachableApples;  
    for (int i = 0; i < n; i++) {  
        if (canReach(awa[i].x)) {  
            reachableApples.push_back(awa[i]);  
        }  
    }  

    // 按摘取力气从小到大排序(可选,如果力气是考虑因素的话)  
    // sort(reachableApples.begin(), reachableApples.end(), [](const apple& a, const apple& b) {  
    //     return a.y < b.y;  
    // });  

    // 遍历并摘取苹果  
    int cnt = 0;  
    for (const auto& apple : reachableApples) {  
        if (s >= apple.y) {  
            cnt++;  
            s -= apple.y;  
        } else {  
            break;  // 力气不足,停止摘苹果  
        }  
    }  

    cout << cnt << endl;  
    return 0;  
}

注意 我使用了 vector<apple> 来存储能摘到的苹果,这样可以更灵活地处理数据,而不必担心数组索引的问题。

如果力气是考虑因素(即想要先摘取力气小的苹果),可以取消注释排序部分。但根据题目描述,这并不是必须的。

我修改了 canReach 函数来检查苹果是否可达,这简化了主循环中的条件判断。

我使用了 C++11 的基于范围的 for 循环来遍历 reachableApples,这使代码更简洁易读。


by fire_flies @ 2024-07-23 20:18:05

@Wish_kazdel ```cpp

 return a.y<=b.y;改为<

by Wish_kazdel @ 2024-07-23 20:19:10

@fire_flies 不行,一开始就写的<还是RE3和5


by fire_flies @ 2024-07-23 20:21:23

@Wish_kazdel 我刚刚就给你改了一个,然后就对了 源码:

#include<bits/stdc++.h>  
using namespace std;  
struct apple{  
    int x,y;  
}awa[5005];  
int n,s,a,b;  
bool cmp(apple a,apple b){  
      return a.y<b.y;  
}  
int main(){  
    cin>>n>>s>>a>>b;  
    for(int i=1;i<=n;i++){  
        cin>>awa[i].x>>awa[i].y;
    }
    sort(awa+1,awa+n+1,cmp);
    int sum=a+b,t=s;
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(awa[i].x<=sum&&t-awa[i].y>=0){
            cnt++;
            t-=awa[i].y;
        }
        if(t-awa[i].y<0)break;
    }
    cout<<cnt;
    return 0;
}

by Wish_kazdel @ 2024-07-23 20:25:27

@fire_flies 感谢,对不起记错了:(


by fire_flies @ 2024-07-23 20:26:36

@Wish_kazdel 没事,你也玩铁?


by Wish_kazdel @ 2024-07-23 20:30:51

@fire_flies 以前玩但现在退坑了


by fire_flies @ 2024-07-23 20:31:37

@Wish_kazdel ok


by Wish_kazdel @ 2024-07-23 20:33:49

@fire_flies 但是我这个名字什么会联想到铁(疑惑


by fire_flies @ 2024-07-23 20:34:28

@Wish_kazdel 头像


| 下一页