hdu4200&&hdu3364 高斯消元

基础题目,犯了个小错误,调了很久,甭提多郁闷了,不多说了,直接贴代码。


4200ACcode:

#include<stdio.h>
#include<string.h>
#define min(a,b) a<b?a:b; 
#define max(a,b) a>b?a:b; 

int n,d,row,col,ans;
char g[110][110];
int num[110];

void gauss()
{
     int i,j,k;
     for (col=row=1;col<=n;col++)
     {
         for (i=row;i<=n;i++) if (g[i][col]) break;
         if (i>n) continue;
         if (i!=row) for (j=col;j<=n+1;j++) 
         k=g[i][j],g[i][j]=g[row][j],g[row][j]=k;  
         for (i=row+1;i<=n;i++) if (g[i][col])
         for (j=col;j<=n+1;j++) g[i][j]^=g[row][j];
         row++;
     }
     return ;
}

void dfs(int k)
{
     if (k<=n)
     {
        num[k]=1,dfs(k+1);
        num[k]=0,dfs(k+1);         
     }     
     else
     {
         int i,j;
         for (i=row-1;i>0;i--)
         {
             k=g[i][n+1];
             for (j=i+1;j<=n;j++) k^=g[i][j]&&num[j];
             num[i]=k;      
         }    
         for (i=1,k=0;i<=n;i++) k+=num[i];
         ans=min(k,ans); 
     }
     return ;
}

int main()
{
    int i,j,k,t,L,R;
    scanf("%d",&t);
    while (t--)
    {
          scanf("%d %d",&n,&d);
          memset(g,0,sizeof(g));
          for (i=1;i<=n;i++)
          {
              scanf("%d",&g[i][n+1]);
              L=max(1,i-d);
              R=min(n,i+d);
              for (j=L;j<=R;j++) g[j][i]=1;    
          }      
          ans=110,gauss();
          for (i=row;i<=n;i++) if (g[i][n+1]) break;
          if (i<=n) ans=-1;
          for (i=1;i<row;i++)
          {
              if (!g[i][i])
              {
                 for (j=i+1;j<=n;j++) if (g[i][j]) break;
                 if (j>n) break;
                 for (k=1;k<=n;k++) 
                 R=g[k][j],g[k][j]=g[k][i],g[k][i]=R;             
              }    
          }
          if (ans>0) dfs(row);
          printf(ans==-1?"impossible\n":"%d\n",ans);
    }
    return 0;
}


3364ACcode:

#include<stdio.h>
#include<string.h> 
#include<iostream>
using namespace std;

const int size=55;

int n,m;
int a[size][size],g[size][size];

__int64 gauss()
{
        int i,j,k;
        int row=1,col=1;
        for (;col<=m;col++)
        {
              for (i=row;i<=n;i++) if (g[i][col]) break;
              if (i>n) continue;
              if (i!=row) for (j=col;j<=m+1;j++) 
                 k=g[row][j],g[row][j]=g[i][j],g[i][j]=k;
              for (i=row+1;i<=n;i++) if (g[i][col])
              for (j=col;j<=m+1;j++) g[i][j]=g[i][j]^g[row][j];
              row++;
        }
        for (i=row;i<=n;i++) if (g[i][m+1]) return 0;
        return 1LL<<(m+1-row);
}

int main()
{
    int cas=0,t,i,j,k,q;
    scanf("%d",&t);
    while (t--)
    {
          printf("Case %d:\n",++cas);
          memset(a,0,sizeof(a));
          scanf("%d %d",&n,&m);
          for (i=1;i<=m;i++)
          {
              scanf("%d",&k);
              for (j=1;j<=k;j++) scanf("%d",&q),a[q][i]=1;    
          }   
          scanf("%d",&q);
          while (q--)
          {
                for (i=1;i<=n;i++) scanf("%d",&g[i][m+1]);
                for (i=1;i<=n;i++) for (j=1;j<=m;j++) g[i][j]=a[i][j];
                printf("%I64d\n",gauss());
          }
    }
    return 0;
} 





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值