UVALive 4255 Guess

8 篇文章 0 订阅

题意:

给你半个矩阵  如果(i,j)的位置是'-'  则说明sum[i...j]<0  如果是'+'  说明sum>0  如果是'0'  说明sum=0  给出一种满足这个矩阵的序列  序列元素绝对值在10以内

思路:

很容易想到的是将sum[i...j]转化为sum[j]-sum[i-1]  即用前缀和来表示  那么题中的矩阵就可以转化成前缀和之间的大小比较  也就是说  我们可以通过将前缀和当成点  将大小关系作为边  求出满足题意的前缀和的拓扑序  那么只需要让拓扑序大的比小的大1  即可很容易的控制元素的绝对值

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 15

int T,n;
int in[N],sum[N],vis[N],qu[N],maz[N][N];
char str[N*N];

void topo()
{
    int i,j,k,s,f;
    for(i=0,k=0,f=10;i<=n;k=0,f--)
    {
        for(j=0;j<=n;j++)
        {
            if(!vis[j]&&!in[j]) qu[k++]=j;
        }
        i+=k;
        for(j=0,s=k;j<s;j++)
        {
            sum[qu[j]]=f;
            vis[qu[j]]=1;
            for(k=0;k<=n;k++)
            {
                if(!vis[k]&&maz[qu[j]][k]) in[k]--;
            }
        }
    }
}

int main()
{
    int i,j,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%s",&n,str);
        memset(in,0,sizeof(in));
        memset(maz,0,sizeof(maz));
        memset(vis,0,sizeof(vis));
        for(i=1,k=0;i<=n;i++)
        {
            for(j=i;j<=n;j++)
            {
                if(str[k]=='+')
                {
                    in[i-1]++;
                    maz[j][i-1]=1;
                }
                else if(str[k]=='-')
                {
                    in[j]++;
                    maz[i-1][j]=1;
                }
                k++;
            }
        }
        topo();
        for(i=1;i<=n;i++) printf("%d%s",sum[i]-sum[i-1],(i==n)?"\n":" ");
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值