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]去掉;
}
因为即使
第二个是
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--;
}
我在改好的代码中多加了
最后是
for(i = 1; i <= n; i++){
if(sum + y[i] <= s && x[i] <= a+b){//条件累加;
sum += y[i];
count++;
}
}
这里的
sort(y+1, y+n+1);
你只排序了
以上是我对此代码的纠错,希望对你有所帮助。
修改后的代码 AC 记录
当然,也可以参考我自己写的代码
我的 AC 代码
by ansan @ 2023-12-24 09:37:25
@Coore 谢谢大佬,懂了懂了,那个i--那里是我没想到的,还是大佬思路通透。
by ansan @ 2023-12-24 10:30:20
@Coore 大佬已关,谢谢