80分,有注释

P1478 陶陶摘苹果(升级版)

@[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


|