zoukankan      html  css  js  c++  java
  • hdu 4951 乘法表

    http://acm.hdu.edu.cn/showproblem.php?pid=4951

    依照我原先的想法是 先找出ans[0] 和ans[1]来,这个好找吧,要是有一行全部是相等的数组成那这行的序号就是ans[0], 要是有一[i,j],i*j=ans[0] i ,那么ans[j]=1,  找到了ans[0]和ans[1] ,然后根据已知的遍历推算出其他的结果。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<map>
      4 #include<algorithm>
      5 #include<cstring>
      6 using namespace std;
      7 
      8 struct node
      9 {
     10     int x,y,zhi;
     11 } p[505][505];
     12 
     13 bool vis[505];
     14 int ans[505];
     15 
     16 int get(int x,int y,int c)
     17 {
     18     int w[505],num=0;
     19     do
     20     {
     21         w[num++]=y%10;
     22         y/=10;
     23     }
     24     while(y);
     25 
     26     do
     27     {
     28         w[num++]=x%10;
     29         x/=10;
     30     }
     31     while(x);
     32 
     33     int sum=0;
     34     for(int i=0,jie=1; i<num; i++)
     35     {
     36         sum+=w[i]*jie;
     37         jie*=c;
     38     }
     39     return sum;
     40 }
     41 
     42 void solve(int n)
     43 {
     44     int count1=2,coun=1;
     45     while(1)
     46     {
     47         for(int i=0; i<n; i++)
     48             for(int j=0; j<n; j++)
     49             {
     50 
     51                 if(vis[p[i][j].x]&&vis[p[i][j].y])
     52                 {
     53                     if(p[i][j].zhi==-1)
     54                         p[i][j].zhi=get(ans[p[i][j].x],ans[p[i][j].y],n);
     55                     if(p[i][j].zhi!=0)
     56                     {
     57                         if(vis[i]&&!vis[j])
     58                         {
     59                             ans[j]=p[i][j].zhi/ans[i];
     60                             vis[j]=true;
     61                             count1++;
     62                         }
     63                         else if(!vis[i]&&vis[j])
     64                         {
     65 
     66                             ans[i]=p[i][j].zhi/ans[j];
     67                             vis[i]=true;
     68                             count1++;
     69                         }
     70                         else if(!vis[i]&&i==j)
     71                         {
     72 
     73                             ans[i]=p[i][j].zhi/2;
     74                             vis[i]=true;
     75                             count1++;
     76                         }
     77                         if(count1>=n)
     78                             return ;
     79                     }
     80                 }
     81             }
     82     }
     83 }
     84 
     85 int main()
     86 {
     87     int n,i,j,a,b,c;
     88     for(int i=0;i<55;i++)
     89         {
     90             scanf("%d%d%d",&a,&b,&c);
     91             printf("get  %d
    ",get(a,b,c));
     92         }
     93 
     94     while(~scanf("%d",&n),n)
     95     {
     96         memset(vis,false,sizeof(vis));
     97         for( i=0; i<n; i++)
     98             for( j=0; j<n; j++)
     99             {
    100                 scanf("%d%d",&p[i][j].x,&p[i][j].y);
    101                 p[i][j].zhi=-1;
    102             }
    103         for( i=0; i<n; i++)
    104         {
    105             for( j=0; j<n; j++)
    106                 if(p[i][j].x!=p[i][j].y)
    107                     break;
    108             if(j==n)
    109             {
    110                 ans[p[i][0].x]=0;
    111                 vis[p[i][0].x]=true;
    112                 break;
    113             }
    114         }
    115 
    116         for( i=0; i<n; i++)
    117         {
    118             for( j=0; j<n; j++)
    119                 if(!vis[i]&&!vis[j]&&ans[p[i][j].x]==0&&i*j==p[i][j].y)
    120                 {
    121                     if(i==p[i][j].y)
    122                     {
    123                         ans[j]=1;
    124                         vis[j]=true;
    125                     }
    126                     else
    127                     {
    128                         ans[i]=1;
    129                         vis[i]=true;
    130                     }
    131                     break;
    132                 }
    133             if(j!=n)
    134                 break;
    135         }
    136 
    137         solve(n);
    138         for( i=0; i<n; i++)
    139             printf("%d ",ans[i]);
    140         printf("
    ");
    141 
    142     }
    143     return 0;
    144 }

    上面的结果当然是错的, 起码每次找p[i][j].zhi 的时候就必须得用大数    = =

    在网上看到一个很简洁的思路 膜拜一下~ 

    http://www.cnblogs.com/yuiffy/p/3914595.html

     1 #include <stdio.h>
     2 #include<iostream>
     3 #include <string.h>
     4 #include <algorithm>
     5 using namespace std;
     6 int a[505][1005],ans[505];
     7 bool vis[505];
     8 
     9 int main()
    10 {
    11     int i,j,n,cas=1;
    12     while(~scanf("%d",&n),n)
    13     {
    14         for(i=0;i<n;i++)
    15             for( j=0;j<2*n;j+=2)
    16                 scanf("%d%d",&a[i][j],&a[i][j+1]);
    17         for(i=0;i<n;i++)
    18         {
    19             for(j=0;j<2*n;j+=2)
    20                  if(a[i][j]!=a[i][j+1])
    21                      break;
    22            if(j>=2*n)
    23            {
    24                ans[0]=i;
    25 
    26                break;
    27            }
    28         }
    29         for(i=0;i<n;i++)
    30         {
    31             if(i==ans[0])
    32                 continue;
    33             memset(vis,false,sizeof(vis));
    34             int num=0;
    35             for(j=0;j<2*n;j+=2)
    36             {
    37                 if(vis[a[i][j]]==false)
    38                 {
    39                     vis[a[i][j]]=true;
    40                     num++;
    41                 }
    42             }
    43             ans[num]=i;
    44         }
    45         printf("Case #%d: %d",cas++,ans[0]);
    46         for(int i=1;i<n;i++)
    47             printf(" %d",ans[i]);
    48         printf("
    ");
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/assult/p/3917880.html
Copyright © 2011-2022 走看看