double Min(double[]a,double[]b){
int len=a.Length;
int[] c=new int[len];
for(int i=0;i<len;i++) c[i]=i;
Array.Sort(c,(p,q)=>(b[p]*a[q]).CompareTo(a[p]*b[q]));
double s=0;
foreach(double p in a) s-=p;
foreach(int ind in c){
s+=2*a[ind];
if(s>=0) return b[ind]/a[ind];
}
return 0;
}
int A[12]={0,0,1,1,1,1,1,1,1,1,1,0},B[12];
int res=9;
printf("1 => 9\n");
for(int K=2;K<=N;K==){
for(int a=1;a<=10;a++) res+=B[a]=A[a-1]+A[a+1];
for(int a=1;a<=10;a++) A[a]+=B[a];
printf("%d => %d\n",K,res);
}
Будет ли это быстрее, не знаю. Но квадратных скобок точно меньше :)