80分,有注释

P1478 陶陶摘苹果(升级版)

ansan @ 2023-12-21 18:26:48


#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(i == n && x[i] > a+b){
            y[i] = 100000;
            break;//防止当i == n时无法把y[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];
                n--;
        }
    }
        sort(y+1, y+n+1);//用sort进行排序; 
        for(i = 1; i <= n; i++){
            if(sum + y[i] <= s && x[i] <= a+b){//条件累加;
                    sum += y[i];
                    count++;
            }
        }
        cout << count;
    return 0;
}

by Coore @ 2023-12-21 19:32:56

@ansan

这代码有些不妥的地方

我先放改好的代码

#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+bx[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 记录

当然,也可以参考我自己写的代码

我的 AC 代码


by ansan @ 2023-12-24 09:37:25

@Coore 谢谢大佬,懂了懂了,那个i--那里是我没想到的,还是大佬思路通透。


by ansan @ 2023-12-24 10:30:20

@Coore 大佬已关,谢谢


|