@[ansan](/user/1120932)
这代码有些不妥的地方
我先放改好的代码
```
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n, s, a, b, x[30000], y[20000], i, j, count = 0, sum = 0;
cin >> n >> s;
cin >> a >> b;
for(i = 1; i <= n; i++){
cin >> x[i] >> y[i];
}
for(i = 1; i <= n; i++){
if(a+b < x[i]){
for(j = i; j < n; j++)//把数组往前移,同时把y[i]给去掉;
x[j] = x[j+1];
for(j = i; j < n; j++)
y[j] = y[j+1];
i--,n--;
}
}
sort(y+1, y+n+1);//用sort进行排序;
for(i = 1; i <= n; i++){
if(sum + y[i] <= s){//条件累加;
sum += y[i];
count++;
}
}
cout << count;
return 0;
}
```
我把下面这段删掉了
```
if(i == n && x[i] > a+b){
y[i] = 100000;
break;//防止当i == n时无法把y[i]去掉;
}
```
因为即使 $i$ 遍历到 $n$ ,只要 $x[i]$ 不满足 $x[i] > a+b$ ,就会将 $n--$ ,直接去掉了无效的 $x[n]$ 和 $y[n]$
第二个是
```
if(a+b < x[i]){
for(j = i; j < n; j++)//把数组往前移,同时把y[i]给去掉;
x[j] = x[j+1];
for(j = i; j < n; j++)
y[j] = y[j+1];
n--;
}
```
我在改好的代码中多加了 $i--$,因为在把数组前移一位后的 $x[i]$ 不知道是否满足 $x[i] > a+b$ ,如果不满足,就要继续前移,直到第 $i$ 位上的 $x[i]$ 满足条件时, $i$ 才会向下一位走。如果没加这个 $i--$ ,就会留存有不满足 $x[i] > a+b$ 的 $x[i]$ ,就会直接导致错解。
最后是
```
for(i = 1; i <= n; i++){
if(sum + y[i] <= s && x[i] <= a+b){//条件累加;
sum += y[i];
count++;
}
}
```
这里的 $x[i] > a+b$ 完全是多余的,因为不满足条件的 $x[i]$ 已经被全部去除了,没必要再到计算结果时再判断一遍,而且再结合上
```
sort(y+1, y+n+1);
```
你只排序了 $y$ 数组,这就导致排序后的 $y$ 数组和 $x$ 数组不对应,这就是导致错解的第二个原因。
以上是我对此代码的纠错,希望对你有所帮助。
[修改后的代码 AC 记录](https://www.luogu.com.cn/record/140448275)
当然,也可以参考我自己写的代码
[我的 AC 代码](https://www.luogu.com.cn/record/140442320)
by Coore @ 2023-12-21 19:32:56
@[Coore](/user/816446)
谢谢大佬,懂了懂了,那个i--那里是我没想到的,还是大佬思路通透。
by ansan @ 2023-12-24 09:37:25
@[Coore](/user/816446)
大佬已关,谢谢
by ansan @ 2023-12-24 10:30:20