⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shizi .cpp

📁 算分分析课程中的石子合并问题实现
💻 CPP
字号:
#include<iostream.h>
void main()
{
int a[101],b[101],c[101],d[101];
int m[101][101],i,j,k,t,n,min,max;
cin>>n;
t=n;
for(i=0;i<n;i++)
{
  cin>>a[i];
  b[i]=a[i];
}
for(i=0;i<n;n--)              //求最小得分方法
{
  if(n==1)
  {
   cout<<a[0]<<" "<<endl;
   break;
  }
  for(j=0;j<n;j++)
  {
   if(n==2)
   {
    m[0][1]=a[0]+a[1];
    break;
   }
   else
    m[j][(j+1)%n]=a[j]+a[(j+1)%n];
  }
  min=m[0][1];
  for(j=0;j<n;j++)
  {
   if(n!=2)
   {
    if(min>m[j][(j+1)%n])
     min=m[j][(j+1)%n];
   }
   else
    break;
  }
  for(j=0;j<n;j++)
  {
   if(n==2)
   {
    a[0]=-1*a[0];
    a[1]=-1*a[1];
    break;
   }
   else
    if(min==m[j][(j+1)%n])
    {
     a[j]=-1*a[j];
     a[(j+1)%n]=-1*a[(j+1)%n];  
    }
  }
  for(k=0;k<n;k++)          //输出一次合并的结果
  {
   cout<<a[k]<<" ";
  }
  a[(j++)%n]=min;
  for(j=0,k=0;k<n;k++)
  {
   if(a[k]>0)
   {
    c[j]=a[k];
    j++;
   }
  }
  for(k=0;k<j;k++)
   a[k]=c[k];
  cout<<endl;
}
for(i=0;i<t;t--)                 //求最大得分方法
{
  if(t==1)
  {
   cout<<b[0]<<" "<<endl;
   break;
  }
  for(j=0;j<t;j++)
  {
   if(t==2)
   {
    m[0][1]=b[0]+b[1];
    break;
   }
   else
    m[j][(j+1)%t]=b[j]+b[(j+1)%t];
  }
  max=m[0][1];
  for(j=0;j<t;j++)
  {
   if(t!=2)
   {
    if(max<m[j][(j+1)%t])
     max=m[j][(j+1)%t];
   }
   else
    break;
  }
  for(j=0;j<t;j++)
  {
   if(t==2)
   {
    b[0]=-1*b[0];
    b[1]=-1*b[1];
    break;
   }
   else
    if(max==m[j][(j+1)%t])
    {
     b[j]=-1*b[j];
     b[(j+1)%t]=-1*b[(j+1)%t];
     break;
    }
  }
  for(k=0;k<t;k++)
  {
   cout<<b[k]<<" ";
  }
  b[(j++)%t]=max;
  for(j=0,k=0;k<t;k++)
  {
   if(b[k]>0)
   {
    d[j]=b[k];
    j++;
   }
  }
  for(k=0;k<j;k++)
   b[k]=d[k];
  cout<<endl;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -