Wish_kazdel @ 2024-07-23 20:07:26
#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
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 头像