社区讨论

什么情况!!!

P1005[NOIP 2007 提高组] 矩阵取数游戏参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi4f3sol
此快照首次捕获于
2025/11/18 18:15
4 个月前
此快照最后确认于
2025/11/18 18:15
4 个月前
查看原帖
我的代码在自己电脑上十个点全过了,可是交上来只有30分!
[codec]
CPP
#include<cstdio>
#include<cstring>
int d[85][85][5],a[85][50],t[50],d2[85][50];
int main()
{
    int m,n,i,j,k,l,x,temp1[50],temp2[50],o,p,q,max[50],b;
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;i++)
      for (j=1;j<=m;j++)
      {
          scanf("%d",&x);
          while (x>0)
          {
              d[i][j][++d[i][j][0]]=x%10;
              x/=10;
        }
      }
    d2[0][0]=d2[0][1]=1;
    for (i=1;i<=m;i++)
    {
        x=0;
        for (j=1;j<=d2[i-1][0]+1;j++)
        {
            d2[i][j]=d2[i-1][j]*2+x;
            x=d2[i][j]/10;
            d2[i][j]%=10;
        }
        if (d2[i][--j]>0)
          d2[i][0]=j;
        else
          d2[i][0]=j-1;
    }
    for (i=1;i<=n;i++)
    {
        memset(a,0,sizeof(a));
        for (j=1;j<=m;j++)
          for (k=j;k>=0;k--)
          {
              memset(temp1,0,sizeof(temp1));
              memset(temp2,0,sizeof(temp2));
              for (l=1;l<=d2[j][0];l++)
                for (o=1;o<=d[i][m-j+k+1][0];o++)
                  temp1[l+o-1]+=d2[j][l]*d[i][m-j+k+1][o];
              x=0;
              for (l=1;l<=d2[j][0]+d[i][m-j+k+1][0];l++)
              {
                  temp1[l]+=x;
                  x=temp1[l]/10;
                  temp1[l]%=10;
            }
            if (temp1[--l]>0)
              temp1[0]=l;
            else
              temp1[0]=l-1;
            x=0;
            for (l=1;l<=temp1[0]+1||l<=a[k][0]+1;l++)
            {
                temp1[l]+=a[k][l]+x;
                x=temp1[l]/10;
                temp1[l]%=10;
            }
            if (temp1[--l]>0)
              temp1[0]=l;
            else
              temp1[0]=l-1;//temp1
            for (l=1;l<=d2[j][0];l++)
                for (o=1;o<=d[i][k][0];o++)
                  temp2[l+o-1]+=d2[j][l]*d[i][k][o];
              x=0;
              for (l=1;l<=d2[j][0]+d[i][k][0];l++)
              {
                  temp2[l]+=x;
                  x=temp2[l]/10;
                  temp2[l]%=10;
            }
            if (temp2[--l]>0)
              temp2[0]=l;
            else
              temp2[0]=l-1;
            x=0;
            for (l=1;l<=temp2[0]+1||l<=a[k-1][0]+1;l++)
            {
                temp2[l]+=a[k-1][l]+x;
                x=temp2[l]/10;
                temp2[l]%=10;
            }
            if (temp2[--l]>0)
              temp2[0]=l;
            else
              temp2[0]=l-1;//temp2
            if (temp1[0]>temp2[0])
            {
                for (l=0;l<=temp1[0];l++)
                  a[k][l]=temp1[l];
                continue;
            }
            if (temp1[0]<temp2[0])
            {
                for (l=0;l<=temp2[0];l++)
                  a[k][l]=temp2[l];
                continue;
            }
            b=0;
            for (l=temp1[0];l>=1;l--)
            {
                if (temp1[l]>temp2[l])
                {
                    b=1;
                    for (o=0;o<=temp1[0];o++)
                      a[k][o]=temp1[o];
                    break;
                }
                if (temp1[l]<temp2[l])
                {
                    b=1;
                    for (o=0;o<=temp2[0];o++)
                      a[k][o]=temp2[o];
                    break;
                }
            }
            if (!b)
              for (l=0;l<=temp1[0];l++)
                a[k][l]=temp1[l];
          }
        memset(max,0,sizeof(max));
        for (j=0;j<=m;j++)
        {
            if (a[j][0]>max[0])
            {
                for (k=0;k<=a[j][0];k++)
                  max[k]=a[j][k];
                continue;
            }
            if (max[0]>a[j][0])
              continue;
            for (k=max[0];k>=1;k--)
            {
                if (a[j][k]>max[k])
                {
                    for (l=0;l<=a[j][0];l++)
                      max[l]=a[j][l];
                    break;
                }
                if (max[k]>a[j][k])
                  break;
            }
        }
        x=0;
        for (j=1;j<=t[0]+1||j<=max[0]+1;j++)
        {
            t[j]+=x+max[j];
            x=t[j]/10;
            t[j]%=10;
        }
        if (t[--j]>0) t[0]=j;
        else t[0]=j-1;
    }
    for (i=t[0];i>=1;i--)
      printf("%d",t[i]);
    if (t[0]==0) printf("0");
    printf("\n");
}
[/codec]

回复

2 条回复,欢迎继续交流。

正在加载回复...