- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 2608
- 在线时间
- 小时
|
发表于 2009-1-22 15:22:34
|
显示全部楼层
编程模拟了一下。呵呵。- /**
- 已知n时的分配方案(int n,k,kn,a[n];):第i号得到a的金币(i为从1到n);其中如果a==-1,表示从他们kn个中间随机选出k个,给kx个金币,其它kn-k个不给;
- 如果a==-2,表示他必死。
- 归纳信息(int n,b[n],c[101];):b为海盗可以被诱惑的金币数;c为b的统计数目。
- 当有n+1个海盗时,第n+1号海盗的方案分析如下:
- 我必须要得到除我之外的[(n+1)/2]票,我根据c,计算我要付出的成本t;如果t<=100,那么余下的归我,如果t>100,我去死,其余的按照原有方案进行;n++;goto start;。
- **/
- #include "stdafx.h"
- #include <conio.h>
- #define N 500
- #define M 100
- int n,k,kn,kx,a[N+3],b[N+3],c[M+3];
- int show()
- {
- int i;
- printf("有%d个海盗时的分配方案:\n",n);
- for(i=0;i<n;i++)
- {
- if(a==-1)printf("第%d号必死,",i+1);
- else if(a==-2);//printf("第%d号得到金币数是随机的,",i+1);
- else printf("第%d号得到%d个金币,",i+1,a);
- }
- if(kn==0)printf("就这样方案是固定的。");
- else printf("其余的%d个海盗中随机挑出%d个给与%d个金币(期望值是%d)。",kn,k,kx,k*kx/kn+1);
- printf("\n\n");
- return 0;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- int i,t,p;
- a[0]=M;kn=0;
- for(n=1;n<=N;n++)
- {
- show();
- // printf("%d,",a[n-1]);
- _getch();
- for(i=0;i<M;i++)c=0;
- if(kn>0)t=k*kx/kn+1;
- for(i=0;i<n;i++)
- {
- if(a==-2)b=t;else b=a+1;
- c[b]++;
- }
-
- p=(n+1)/2;t=M;
- for(i=0;i<M+2;i++)
- {
- if(p<=c)break;
- p-=c;
- t-=i*c;
- if(t<0)break;
- }
- if(t<p*i)a[n]=-1;
- else if(p==c)
- {
- a[n]=t-p*i;
- kx=i;
- kn=0;
- for(i=0;i<n;i++)
- {
- if(b<=kx)a=b;
- else a=0;
- }
- }
- else
- {
- a[n]=t-p*i;
- kx=i;
- k=p;
- kn=c;
- for(i=0;i<n;i++)
- {
- if(b<kx)a=b;
- else if(b==kx)a=-2;
- else a=0;
- }
- }
- }
- printf("---------------End---------------\n");
- _getch();
- return 0;
- }
复制代码 |
|