您的位置:首页 > 产品设计 > UI/UE

Children’s Queue (大数/高精度)

2017-12-08 16:55 316 查看
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1297

题意:有n个位置,男孩女孩排队,要求女孩至少要2个在一起,求符合规则的结果

这一题是排序问题,因为结果非常大,且为前几项相加,所用到了大数的加法。

题目的分析也很有意思

规则:女孩至少要2个在一起

求f(n)

一 , 当最后一个是男生M,则前 n-1 只要符合规则的排列即可,有f(n-1)个

~~~~|M     有f(n-1)个

二,当最后一个为女生F,则有两种情况

1)最后两个都为女生 ,则则前 n-2 只要符合规则的排列即可,有f(n-2)个

~~~~|FF    有f(n-2)个

2)最后两个都为女生 ,则则前 n-2 也可以不符合规则,

         此时第n-2个是F,第n-3是M,此时前n-2个不符合规则,但因为第n-2 的F与第n-1 的F相邻,所以整体符合规则,有f(n-4)个

~~~~|MFFF     有f(n-4)个

#include <iostream>
#include <cstring>
#include <string>
using namespace std;

string add(string s1,string s2)
{
string sa,sb;
sa=s1;
sb=s2;
if(sa.length()<sb.length())
{
//让sa 指向长的字符串,sb 指向短的字符串
sa=s2;
sb=s1;
}
int len1=sa.length();
int len2=sb.length();

//将sb的每一位与0的差值加到sa中的每一位中
//此时sa中每一位表示此位上的个数  例如十位数上有11个数,则其真实值为110
for(int i=len2-1,j=len1-1; i>=0; i--,j--)
sa[j]+=sb[i]-'0';

for(int i=len1-1; i>=1; i--)
{
//检查sa[1]~sa[len1-1],如果其值大于'9',则在其前一位进一,而s[0]单独判断
if(sa[i]>'9')
{
sa[i-1]++;
sa[i]-=10;
}
}

if(sa[0]>'9') //最高位大于'9',则在前加一
{
sa[0]-=10;
sa='1'+sa;
}
return sa;
}

int main ()
{
int n;
string f[1001];
f[0]="1"; //当n=4时,MFFF这种情况只有一种可能
f[1]="1";
f[2]="2";
f[3]="4";
for(int i=4; i<=1001; i++)
{
f[i]=add(f[i-1],f[i-2]);
f[i]=add(f[i],f[i-4]); //两步来实现f
=f[n-1]+f[n-2]+f[n-4]
}
while(cin>>n) //提示:预先算出所有值,不然提交会超时
{
cout<<f
<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: