• n 支队伍比赛,分别编号为 0,1,2。。。。n-1,已知它们之间的实力对比关系, 存储在一个二维数组 w[n][n]中,w[i][j] 的值代表编号为 i,j 的队伍中更强的一支。


    n 支队伍比赛,分别编号为 0,1,2。。。。n-1,已知它们之间的实力对比关系,
    存储在一个二维数组 w[n][n]中,w[i][j] 的值代表编号为 i,j 的队伍中更强的一支。
    所以 w[i][j]=i 或者 j,现在给出它们的出场顺序,并存储在数组 order[n]中,
    比如 order[n] = {4,3,5,8,1......},那么第一轮比赛就是 4 对 3, 5 对 8。.......
    胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,
    下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是 4 对 5,直至出现第一名
    编程实现,给出二维数组 w,一维数组 order 和用于输出比赛名次的数组 result[n],
    求出 result。

    class CContest:public CTest
    	{
    	public:
    		void Contest(int (*w)[3],int order[],int n,int result[])
    		{
    			int *temOrder=new int[n];
    			memset(temOrder,0,n);
    			int i,j,k;
    			i=j=k=0;
    			bool flag=true;
    			int len=n;
    			while(k<n)
    			{
    				int *pFrom,*pTo;
    				if(flag){pFrom=order;pTo=temOrder;flag=false;}
    				else{pFrom=temOrder;pTo=order;flag=true;}
    				i=j=0;
    				
    				for(;i<len;i+=2)
    				{
    					if(i+1==len)
    					{
    						pTo[j++]=pFrom[i];
    						result[k++]=pFrom[i];
    						break;
    					}
    					if(w[pFrom[i]][pFrom[i+1]]==i)
    					{
    						pTo[j++]=pFrom[i];
    						result[k++]=pFrom[i+1];
    					}
    					else
    					{
    						pTo[j++]=pFrom[i+1];
    						result[k++]=pFrom[i];
    					}
    				}
    				len=j;
    			}
    			i=0;j=n-1;
    			for(;i<j;i++,j--)
    					swap(result[i],result[j]);
    		}
    		void Test()
    		{
    			int w[3][3]={{0,1,2},{1,1,1},{2,1,2}};
    			int order[3]={0,1,2};
    			int result[3];
    			Contest(w,order,3,result);
    			cout<<"比赛结果:";
    			for(int i=0;i<3;i++)
    				cout<<setw(5)<<result[i];
    			cout<<endl;
    		}
    	};
    	
    };
    using namespace Cracking;
    
    //修正后的求next数组各值的函数代码
    void get_nextval(char const* ptrn, int plen, int* nextval)
    {
        int i = 0;
        nextval[i] = -1;
        int j = -1;
        while( i < plen-1 )
        {
            if( j == -1 || ptrn[i] == ptrn[j] )   //循环的if部分
            {
                ++i;
                ++j;
                //修正的地方就发生下面这4行
                if( ptrn[i] != ptrn[j] ) //++i,++j之后,再次判断ptrn[i]与ptrn[j]的关系
                    nextval[i] = j;      //之前的错误解法就在于整个判断只有这一句。
                else
                    nextval[i] = nextval[j];
            }
            else                                 //循环的else部分
                j = nextval[j];
        }
    }
    
    
    
    void main()
    { 
    
    
    
    	CTest *p=new CContest();
    	p->Test();
    
        system("pause");
    }
    

      

  • 相关阅读:
    mongodb 数据库创建用户名密码
    idea代码自动换行
    [ICPC2014 WF] Metal Processing Plant
    [NWRRC2015] Insider's Information
    [CERC2013] Escape
    [ICPC2015 WF] Tours
    AHOI 2022 题目选做
    LNOI 2022 题目选做
    [JOISC 2017 Day1] 开荒者
    [USACO 2020 US Open Platinum] Circus
  • 原文地址:https://www.cnblogs.com/dyc0113/p/3237887.html
Copyright © 2020-2023  润新知