下面是我写的poj 1738 关于石子合并的代码,那位大侠帮我看看

本文介绍了一种针对石子堆合并问题的算法实现思路。通过寻找单调区间进行合并操作,如12321合并为3321等,旨在减少元素数量至2个,并返回所有合并操作的总和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//我的想法是 在 石子堆中找一个单调的区间  例如   1 2 3 2 1,分别合并为以下情况 3 3 2 1, 3 3 3,6 3, 9。基本是这种思想,

//可是提交后老是 WA,希望那位高手可以帮帮忙

 

 

#include <stdio.h>


int solve(int *a,int n);

int main ()
{
  int stone[50000];
  int anwser[10000];
  int i,j=0;
  int n;
 
 
   scanf("%d",&n);
   while(n)
   {
       for(i=0;i<n;i++)
       scanf("%d",&stone[i]);
    if(n!=1)
          anwser[j]= solve(stone,n);
       else
    anwser[j]=0;

    scanf("%d",&n);
       j++;
   }

   for(i=0;i<j;i++)
    printf("%d/n",anwser[i]);
   
}

int solve(int *stone,int n)
{
  
   int sum=0;
   int i,j,l;
   while(n>=3)
   {
    for(i=1;i<n-1&&n>=3;i++)
    {
           if(stone[i-1]<=stone[i+1])
     {
             sum+=stone[i]=stone[i-1]+stone[i];
               for(j=i;j<n;j++)
          stone[j-1]=stone[j];
             n--;
             i--;
     }
    }
         
      for(l=n-2;l>0&&n>=3;l--)
   {
           if(stone[l+1]<=stone[l-1])
     {
            sum+=stone[l]=stone[l+1]+stone[l];
       for(j=l+2;j<n;j++)
            stone[j-1]=stone[j];
               n--;
     }
   }
   
   }

   sum+=stone[0]+stone[1];
   return sum;
}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值