无效内存引用,c语言

2025-04-26 14:46:12
推荐回答(1个)
回答1:

//这是我重新打的更新过后的程序,应该耗时比你的少许多,应该可以通过了。 
#include

#define size 100010

using namespace std;

int a[size]; //数组定在函数里面往往会让程序莫名挂掉 
int n,m,max,min,maxx,minx; //maxx 和 minx 分别表示 max 和 min 所在的位置这样可以用来优化 

void new_max(){ //这个函数用来更新 max和 maxx的值 
for(int i=1;i<=n;i++)
if(a[i]>max){
max=a[i];
maxx=i;
}
}

int main(){
int base,attack;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
max=a[1];maxx=1; //从 23 行到 32为 max,min的初始值 
min=a[1];minx=1;
for(int i=2;i<=n;i++){
if(a[i]>max){
max=a[i]; maxx=i;
}
if(a[i] min=a[i]; minx=i;
}
}
//对于你程序的优化在于这样一点:攻击只会降防御,所以每次攻击都是对当前基地只减不加
//例如攻击的如果不是之前的最大防御,那么最大防御依然是最大防御。如果攻击的是最大防御,那么就需要重新寻找了。 
//类似的,如果攻击的是最小防御,那么最小防御攻击后依然是最小防御,如果不是那就比较攻击后的防御与之前的最小防御 
for (int i=1;i<=m;i++){
   scanf ("%d %d",&base,&attack);
   a[base]-=attack;
   if (a[base]<0) a[base]=0;
   if(base==maxx){ //如果攻击了最大防御 
    max=a[base];
    new_max(); //更新最大防御 
   }
   if(base==minx) //如果攻击了最小防御 
    min=a[base];
   else //如果攻击的不是最小防御 
    if(min>a[base]){
    min=a[base];
    minx=base;
    }
    printf("%d %d\n",max,min);
}
return 0;
}