zoukankan      html  css  js  c++  java
  • 杭电ACM 1297 Children’s Queue

    这道题是排序问题,可以用递归方法解决。

    计算F(n):

    一:当最后一个是男孩M时候,前面n-1个随便排出来,只要符合规则就可以,即是F(n-1);

    二:当最后一个是女孩F时候,第n-1个肯定是女孩F,这时候又有两种情况:

            1)前面n-2个可以按n-2个的时候的规则来,完全可以,即是F(n-2);

            2)但是即使前面n-2个人不是合法的队列,加上两个女生也有可能是合法的。当第n-2是女孩而n-3是男孩的情况,可能合法,情况总数为F(n-4);

    综上所述:总数F(n)=F(n-1)+F(n-2)+F(n-4);并且,F(0)=1,F(1)=1,F(2)=2,F(3)=4。

    程序如下,不过这个程序效率好低啊,杭电的oj返回的是超出时间限制。。

    #include<iostream>
    using namespace std;
    int Fun(int);
    int main(){
    	int n;   //error  要用大数
    	while(cin>>n){
    		cout<<Fun(n)<<endl;
    	}
    }
    int Fun(int n){
    	if(n==0||n==1) return 1;
    	if(n==2) return 2;
    	if(n==3) return 4;
    	return Fun(n-1)+Fun(n-2)+Fun(n-4);
    }
    好,得了,又是大数的问题。。。。在这上面今后一定要注意。

    大数相加,可以用以下模版解决。熟记模版很重要~~

    //大数加法 
    string add(string s1,string s2)
    {
        
        int j,l,la,lb;
        string max,min;
        max=s1;min=s2;
        if(s1.length()<s2.length()) {max=s2;min=s1;}
        la=max.size();lb=min.size();
        l=la-1;
        for(j=lb-1;j>=0;j--,l--) max[l] += min[j]-'0';   //用到加法运算符,全部按照asiic码表来,就会多加一次48,所以要减去ascii值为48的‘0’
        for(j=la-1;j>=1;j--) if(max[j]>'9'){max[j]-=10;max[j-1]++;}
        if(max[0]>'9') {max[0]-=10;max='1'+max;}
        return max;
    }

    综上,程序可以是:

    #include<iostream>
    #include<string> 
    using namespace std;
    string add(string s1,string s2)
    {
        
        int j,l,la,lb;
        string max,min;
        max=s1;min=s2;
        if(s1.length()<s2.length()) {max=s2;min=s1;}
        la=max.size();lb=min.size();
        l=la-1;
        for(j=lb-1;j>=0;j--,l--) max[l] += min[j]-'0'; 
        for(j=la-1;j>=1;j--) if(max[j]>'9'){max[j]-=10;max[j-1]++;}
        if(max[0]>'9') {max[0]-=10;max='1'+max;}
        return max;
    }
    int main(){
    	int n,i;
    	string a[1001];
    	a[0]="1";
    	a[1]="1";
    	a[2]="2";
    	a[3]="4";
    	for(i=4;i<1001;++i)
    	   a[i]=add(add(a[i-1],a[i-2]),a[i-4]);
    	 while(cin>>n)
    	    cout<<a[n]<<endl;
    	return 0;	  
    }

  • 相关阅读:
    20201112 装饰器之函数即变量
    2月13日:毕业设计进度
    2月12日:毕业设计进度
    2月11日:毕业设计进度
    2月10日:毕业设计进度
    2月9日:毕业设计进度
    2月8日:毕业设计进度
    2月7日:毕业设计进度
    2月6日:毕业设计进度
    2月5日:毕业设计进度
  • 原文地址:https://www.cnblogs.com/u013533289/p/4477332.html
Copyright © 2011-2022 走看看