当前位置: 代码迷 >> C语言 >> [讨论]第十期编程题目
  详细解决方案

[讨论]第十期编程题目

热度:99   发布时间:2007-04-12 10:13:26.0

我的第一题答案:
/*假设这两个数最小的一个从1开始变化
min max 遇点表示此数跟最小熟配合必死
1 2. 3----
2 -----遇2通杀
3 4 5. 6-----
4 5 6 7. 8----
5 -----遇5通杀
6 7 8 9 10.11----
7 -----遇7通杀
8 9 10 11 12 13.14----
9 10 11 12 13 14 15.16----
10 -----遇10通杀
11 12-------------17 18.19----
*/
#include "stdio.h"
#include "stdlib.h"
int main()
{
long a,b,i,j;
int n=1;
struct str
{
long k; //存放最小通杀数
struct str *next;
}*head,*p,*pb,*pa;
struct ss //存放测试的几组输入数据
{
long nexta;
long nextb;
struct ss *next;
}*h1,*hp,*hd;
while(1)
{
scanf("%ld",&a);
if(a<1) break;
scanf("%ld",&b);
if(b<1) break;
else
{
hp=(struct ss*)malloc(sizeof(struct ss));
hp->nexta=a;
hp->nextb=b;
hp->next=NULL;
if(n==1)
{
h1=hd=hp;
n=0;
}
else hd->next=hp;
hd=hp;
}
}
printf("输入完毕\n");
while(h1)
{
a=h1->nexta;
b=h1->nextb;
hp=h1->next;
h1->next=NULL;
free(h1);
h1=hp;
if(a>b)
{
j=a;
a=b;
b=j;
} /*a小b大*/
if(a==1)
{
if(b==2) printf("0\n");
else printf("1\n");
continue;
}
else if(a>1)
{
head=(struct str*)malloc(sizeof(struct str));
head->k=2;
head->next=NULL;
pa=p=head;
j=1; //最小通杀数相对与对应的i的增加幅度
for(i=2;i<=a;i++)
{
if(a==pa->k)
{
n=1;
printf("1\n");
break;
}
else
{
if(i==pa->k)
{
if(pa->next!=NULL)
pa=pa->next;
}

else
{
pb=(struct str*)malloc(sizeof(struct str));
j+=1;
pb->k=i+j;
pb->next=NULL;
p->next=pb;
p=pb;
if(pa->k<i)
{
pa=pa->next;
}
}
}
}
if(n!=1)
{
if(b==p->k) printf("0\n");
else printf("1\n");
}
}
while(head!=NULL)
{
pb=head->next;
head->k=NULL;
head->next=NULL;
free(head);
head=pb;
}
n=0;
}
return 0;
}
这个不完善,继续优化下去就能得到黄金分割的方法了


----------------解决方案--------------------------------------------------------

有是周五了.
iwfy要找人出下期的题目了


----------------解决方案--------------------------------------------------------
解释下算法呗
很迷茫
----------------解决方案--------------------------------------------------------
/*假设这两个数最小的一个从1开始变化
min max 遇点表示此数跟最小熟配合必死
1 2. 3---- 从3开始不管是多少,取到剩2个就给对方剩下1:2的组合,那么就赢
2 -----遇2通杀 不管是多少,取剩下1个就剩下2:1的组合(就是上面的1:2) ,所以只要最小数是2就能赢
3 4 5. 6----- 从4开始前面有1:2的组合那么这样取3-2:4-2==1:2,3:5(不管怎么取都不能组合成一步封杀对方的组合)所以3:5的组合自己会输,那么5以后的话取到剩5个组成3:5的组合给对方就能赢
4 5 6 7. 8---- 从5开始4-3:5-3==1:2, 4-1:6-1==3:5, 4:7(不能组合成前面的任何一种封杀组合,自己输)7以后都赢
5 -----遇5通杀 因为前面有5:3的组合,那么遇到5自己都赢
6 7 8 9 10.11---- 6-5:7-6==1:2, 6-3:8-3==3:5, 6-2:9-2==4:7, 6:10(自己输)10以后都赢
7 -----遇7通杀 因为前面有4:7的组合,那么遇到7自己赢
8 9 10 11 12 13.14---- 8:9==1:2, 8:10==3:5, 8:11==4:7, 8:12==6:10, 8:13(自己输) 13以后都赢
9 10 11 12 13 14 15.16-9:10==1:2, 9:11==3:5, 9:12==4:7, 9:13==6:10, 9:14==8:13, 9:15(自己输)15以后赢
10 -----遇10通杀 因为前面有6:10的组合,所以遇10自己赢
11 12-------------17 18.19-第9行各数多了2,第9行到9:15,就是此行的11:17这之前自己都能赢,11:18(自己输)
12 13----------------18 19.比第11行各数多1,第11行到11:17,此行到12:18之前自己都赢,12:19(自己输)
13 -----遇13通杀
14 15----21 22. 23--比第12行各数多2,第12行到12:19,此行到14:21之前自己赢,14:22(自己输)
15 -----遇15通杀
16 17----24 25. 26--
比第14行各数多2,第14行到14:22,此行到16:24前自己赢,16:25(自己输)
17 18----25 26 27.比第16行各数多1,16行到16:25,此行到17:26前自己赢,17:27(自己输)

思路就是这样,继续下去就能得出为什么用黄金分割的方法正好可以解此题
我的代码没继续到黄金分割,所以运行得到结果就比较慢,数学真有意思


----------------解决方案--------------------------------------------------------
这期参与的讨论的人少,下期由crackerwang给大家出,希望大家踊跃参与讨论
----------------解决方案--------------------------------------------------------
  相关解决方案