杭电1257
方法一:存好导弹高度,依次寻找当前系统可以发射的全部导弹,用完的标记,累加得出答案(费时)
1 #include<stdio.h> 2 int a[1000000]; 3 int main() 4 { 5 int n,i,maxn,j,ans; 6 while(~scanf("%d",&n)) 7 { 8 for(i=0; i<n; ++i) 9 scanf("%d",a+i); 10 for(i=ans=0; i<n; ++i) 11 { 12 if(a[i]) 13 { 14 ans++; 15 maxn=a[i]; 16 a[i]=0; 17 for(j=i+1; j<n; ++j) 18 if(a[j]&&a[j]<=maxn) 19 { 20 maxn=a[j]; 21 a[j]=0; 22 } 23 } 24 } 25 printf("%d\n",ans); 26 } 27 }
方法二:开一个数组用来存每一个已开系统的拦截上限,以后每个导弹发射时查找此数组,找到其中最适合的系统,并更新上限,找不到时重新开一个系统(数度快)
1 #include<stdio.h> 2 int a[1000000],dd[1000000]; 3 int main() 4 { 5 int n,i,minj,j,k,ans; 6 while(~scanf("%d",&n)) 7 { 8 for(i=ans=k=0; i<n; ++i) 9 { 10 scanf("%d",a+i); 11 if(!i) 12 { 13 ans++; 14 dd[k]=a[i]; 15 } 16 else 17 { 18 for(j=minj=0; j<=k; ++j) 19 { 20 if(dd[j]==a[i]) 21 { 22 minj=j; 23 break; 24 } 25 if(dd[j]>=a[i]) 26 { 27 if(dd[minj]>=a[i]) 28 { 29 if(dd[j]<dd[minj]) 30 minj=j; 31 } 32 else 33 minj=j; 34 } 35 } 36 if(dd[minj]<a[i]) 37 { 38 ans++; 39 dd[++k]=a[i]; 40 } 41 else 42 dd[minj]=a[i]; 43 } 44 } 45 printf("%d\n",ans); 46 } 47 }