标题:韩信点兵算法怎么才能不超时,求给个思路或者算法
只看楼主
骑猪闯天下
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-4-23
结帖率:100%
 问题点数:0 回复次数:6 
韩信点兵算法怎么才能不超时,求给个思路或者算法
要求由键盘输入A,B,C,D,E,F,G,H,a,b,c,d,e,f,g,h十六个数,分别代表每A人一列余a、每B人一列余b、每C人一列余c、每D人一列余D、每E人一列余e、每F人一列余f、每G人一列余g、每H人一列余h,其中A,B,C,D,E,F,G,H为互不相等的质数


输出格式

输出总兵士数,要求输出满足条件的最小的一个,但要满足8种排法的每一种排法至少可排一列。(保证给的数据,有结果且计算的结果不会超过2的63次方)


输入样例

2 3 5 7 11 13 17 19
1 1 1 1 1 1 1 1


输出样例

9699691

是不是先求最大公倍数?
搜索更多相关主题的帖子: 公倍数 
2013-04-29 09:19
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
这个思路你试试:

a[0..7] = 2 3 ... 19
m[0..7] = 1 1 ... 1
s[0..7] = 0 0 ... 0
all = a[0] *...*a[7];

s[i]:
  tmp = all / a[i];
  for (n = tmp * 2;;n+=tmp)
    if (m[i] == n % a[i])  break;
  s[i] = n;

result:
  tmp = (s[0] +...+ s[7]);//这里要考虑溢出
  result = tmp % all;

[ 本帖最后由 azzbcc 于 2013-5-1 16:06 编辑 ]


[fly]存在即是合理[/fly]
2013-04-29 10:00
骑猪闯天下
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-4-23
得分:0 
回复 2楼 azzbcc
#include<stdio.h>
#include<math.h>
main()
{    double x=0,a[8][3],s=1,k,flag;
      int i;
    for(i=0;i<8;i++){scanf("%lf",&a[i][0]);s=s*a[i][0];}
    for(i=0;i<8;i++) scanf("%lf",&a[i][1]);
    for(i=0;i<8;i++)   
    {
        for(k=1;;k++)
            if(fmod(((s/a[i][0])*k),a[i][0])==a[i][1]) {a[i][2]=(s/a[i][0])*k; break;}     
    }
   
    for(i=0;i<8;i++)
       x=x+a[i][2];   
    x=fmod(x,s);

    flag=0;
    for(i=0;i<8;i++)
        if(x<a[i][0]) {flag=1;break;}
    if(flag==1) x=x+s;

    printf("%.0lf",x);
}
找到个答案就是用的你那个思路,但是
for(i=0;i<8;i++)
       x=x+a[i][2];   
    x=fmod(x,s);
这段代码的功能还是不太清楚啊,能给说明一下么
2013-04-29 11:15
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
这段代码就是求result过程,fmod是double求模,不过这道题,用double可以?


[fly]存在即是合理[/fly]
2013-04-29 12:21
骑猪闯天下
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-4-23
得分:0 
回复 4楼 azzbcc
为什么把8个数+起来再对s求模就能得到想要的结果?
我想知道这是什么思想啊= =,主要是看不懂思想,代码的基本作用还是知道的,就是不知道为什么8个数+起来再对s求模就能得到想要的结果?
2013-04-29 14:15
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
s[i]满足:模a[i]等于m[i],且能被a[j](j!=i)整除

所以a[i]能整除s[j],即s[i]+s[j]模a[i]等于m[i]


[fly]存在即是合理[/fly]
2013-04-29 19:49
骑猪闯天下
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-4-23
得分:0 
回复 6楼 azzbcc
太感谢了,我明白了
2013-04-30 08:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-405877-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.196643 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved