zoukankan      html  css  js  c++  java
  • 中间的球( floyd算法 )

    中间的球
    Time Limit: 1000 MS Memory Limit: 32767 K
    Total Submit: 97(37 users) Total Accepted: 48(35 users) Rating: Special Judge: No
    Description

    有N个外形一样但重量不同的球,N是一个奇数,每个球被标号为1、2、...、N,你的任务是 找到重量在中间的那个球,

    我们可以通过一些比较得知某些球比其他的球要中或者轻,从而找 到一些不可能是重量处在中间的球,比如: 给定N=5个球和M=4次比较,

    2比1重 4比3重 5比1重 4比2重 因为2 4 5都比1重,而1 2 3又都比4轻,从而能够判断1和4是不可能为重量处在中间的那个球。

    现在请写一个程序,来找出有多少个球可以判断出不可能是中间重量的球。

    Input
    输入数据首先包括一个整数t,表示测试数据组数,然后是t组测试数据,每组包括一个整数N,M,然后 为M行每行两个整数a,b表示a比b重。N<=100
    Output
    输出能够确定不可能在中间的球的数量
    Sample Input
    1 5 4 2 1 4 3 5 1 4 2
    Sample Output
    2

    一开始相处了个土办法,那就是先更新一下,水过了;

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int a[101][101];
    void gengxin(int x,int y,int n)
    {
        int i;
        for(i=1;i<=n;i++)
        {
            if(a[i][x]==1&&a[i][y]==0)
            {
                a[i][y]=1;
                gengxin(i,y,n);
            }
        }
    }
    int chazhao1(int x,int n)
    {
        int i,sum1=0;
        for(i=1;i<=n;i++)
        {
            if(a[i][x]==1)
            {
                sum1++;
            }
        }
        return sum1;
    }
    int chazhao2(int x,int n)
    {
        int i,sum=0;
        for(i=1;i<=n;i++)
        {
           if(a[x][i]==1)
            {
                sum++;
            }
        }
        return sum;
    }
    int main()
    {
        int t,N,M,a1,b;
        while(~scanf("%d",&t))
        {
            while(t--)
            {
                scanf("%d%d",&N,&M);
                int i,j;
                for(i=0;i<=N;i++)
                {
                    for(j=0;j<=N;j++)
                    {
                        a[i][j]=0;
    
                    }
                }
                for(i=0;i<M;i++)
                {
                    scanf("%d%d",&a1,&b);
                    a[a1][b]=1;
                }
                for(i=1;i<=N;i++)
                {
                    for(j=1;j<=N;j++)
                    {
                        if(a[i][j]==1)
                        {
                            gengxin(i,j,N);
                        }
                    }
                }
                int x=N/2+1;
                int num=0;
                for(i=1;i<=N;i++)
                {
                    if(chazhao1(i,N)>=x)
                    {
                        num++;
                    }
                    else if(chazhao2(i,N)>=x)
                    {
                        num++;
                    }
                }
                printf("%d
    ",num);
            }
        }
        return 0;
    }

    其实这个题的标准解法是floyd算法,关于floyd,参考大神博客http://blog.csdn.net/zhongkeli/article/details/8832946

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    #include<queue>
    #include<set>
    using namespace std;
    int a[101][101];
    int findMax(int x,int n)
    {
        int i,sum=0;
        for(i=1;i<=n;i++)
        {
            if(a[i][x]==1)
            {
                sum++;
            }
        }
        return sum;
    }
    int findMin(int x,int n)
    {
        int i,sum=0;
        for(i=1;i<=n;i++)
        {
            if(a[x][i]==1)
            {
                sum++;
            }
        }
        return sum;
    }
    int main()
    {
        int T;
        while(~scanf("%d",&T))
        {
            while(T--)
            {
                memset(a,0,sizeof(a));
                int n,m;
                scanf("%d%d",&n,&m);
                int i;
                int x,y;
                for(i=0;i<m;i++)
                {
                    scanf("%d%d",&x,&y);
                    a[x][y]=1;
                }
                int j,k;
                for(k=1;k<=n;k++)
                {
                    for(i=1;i<=n;i++)
                    {
                        for(j=1;j<=n;j++)
                        {
                            if(a[i][k]==1&&a[k][j]==1)//最重要的就是这点
                            {
                                a[i][j]=1;
                            }
                        }
                    }
                }
                int sum=0;
                for(i=1;i<=n;i++)
                {
                    if(findMax(i,n)>n/2||findMin(i,n)>n/2)
                    {
                        sum++;
                    }
                }
                printf("%d
    ",sum);
            }
        }
        return 0;
    }
  • 相关阅读:
    数据库第三范式的思考
    channel通道例子
    go 测试代码性能实例
    go 新建項目引入gin失敗
    go 创建切片slice的四种方法
    Hibernate查询操作
    shell 分割训练数据
    hadoop streaming 分桶到不同的part
    C语言调用另一个文件的方法
    在springboot中使用jdbcTemplate(3)
  • 原文地址:https://www.cnblogs.com/beige1315402725/p/5020301.html
Copyright © 2011-2022 走看看