卡片游戏及解答程序

转载 2006年06月23日 15:24:00
卡片游戏
程序文件名: card.cpp/card.pas/...
  NKPC竞赛的选手小金和小李经常玩一个小游戏。
  这个游戏规则很简单:
  小金在手里拿着N张卡片,每张卡片上写着一个正整数。
  小李知道卡片上的数都是不同的,但他不知道哪个是最大值。
  游戏一开始,小金任意地抽出一张卡片给小李看,并且问小李"这个数字是不是最大的?"
  如果小李回答"",那么游戏结束;否则小再重新抽出一张不同的卡片,重复上面的问题。
  当小金手里只剩最后一张卡片时,那么小李只能回答""
  如果小李恰好猜中了最大值,也就是当小金抽出那张最大的数字,小李回答"",他就赢了。
  最近, 小李想出了一个找到最大值的好方法:
  对第一张到第M(1<=M<N)张卡片都回答""
  然后,从第M+1张开始,若当前卡片上的数比以前出现过的所有数都大, 那么回答""; 否则回答""
  也许你已经注意到, 在小李的方法中最重要的是如何取M的值。
  你的目标是编一个程序来帮小李找到最好的M, 即让小李以最大的概率赢得这个游戏。
 
输入(请使用标准输入输出,而不要读写文件)
  只有一个整数N (3<=N<=100000) 
输出(请使用标准输入输出,而不要读写文件)
  输出为一个整数M ,表示使得效力获胜概率最大的M 
样例输入1
样例输出1
3
1
样例输入2
样例输出2
5
2

 

#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <time.h>
#include <dos.h>
#include <string.h>

#define NUMBER  100000
int a[NUMBER][100];
int n=1000;
int N=5;

void initiala()
{
 time_t t;
 t=time(NULL);
 clock_t goal;
 srand((unsigned)t);
 for(int i=0;i<100;i++)
 {
  for(int j=0;j<NUMBER;j++)
  {
   a[j][i]=rand()%n;   
  }
  goal = 71 + clock();
  while( goal > clock() );
  cout<<"/1 ";
  if(i%10==9)
    cout<<i+1<<"%"<<endl;
 }
}

bool cmpi(int i,int m)//处理a[i],前m个.
{
 int mmax,max=0;
 bool flag=false;
 mmax=a[i][0];
    for(int j=1;j<N;j++)
 {
        if(a[i][j]>mmax&&j<m)//找到前m个的最大值
  {
      mmax=a[i][j];
   max=mmax;
  }
  else if(a[i][j]>max&&!flag)//把m个后的第一个比mmax大的值给max
  {
   max=a[i][j];
   flag=true;
  }
  else if(a[i][j]>max&&flag)//返回false
   return false;

 }
 if(!flag)
  return false;
 return true;
}

int dealm(int m)//取m时成功的个数,总共有100个数列
{
 int suc=0;
 for(int i=0;i<NUMBER;i++)
             if(cmpi(i,m)) suc++;
   return suc;
}

void main()
{
 int index=0;
 int big=0;
 int temp=0;
 char ch[10];
 memset(ch,0,10);
 clock_t goal;
   cout<<"初始化序列..."<<endl;
   initiala();
   cout<<"输入N,(1<N<100):"<<endl;
   cin>>N;
  start:
    big=0;
   for(int i=1;i<N;i++)
    {
           goal=clock();
     temp=dealm(i);
     if(temp>big)
     {
      big=temp;
      index=i;
     }
     if(i*100/N%1==0)    //输出进度
           if(clock()-goal>5)
        cout<<(i*100/N+1)<<"%"<<endl;
    }
     cout<<"成功率: "<<(float)big/(NUMBER/100)<<"%"<<endl;
  cout<<"选择的最佳m="<<index<<endl;
     cout<<"继续计算请输入数字:"<<endl;
  cin>>ch;
  int k=0;
  if(ch[0]>'0'&&ch[0]<='9')
  {
   N=0;
   while(ch[k]!='/0')
   {
             N=N*10+ch[k]-'0';
    k++;
   }
   memset(ch,0,10);
   goto start;
  }
  cout<<"Press any key to end!"<<endl;
  getchar();
}

 

                  

 

相关文章推荐

2013金山西山居创意游戏程序挑战赛——初赛(2) C 卡片游戏 (hdu 4550 )

http://acm.hdu.edu.cn/showproblem.php?pid=4550 题意: 小明最近宅在家里无聊,于是他发明了一种有趣的游戏,游戏道具是N张叠在一起的卡片,每张卡...

游戏王 卡片制作

  • 2013年03月24日 13:20
  • 18.6MB
  • 下载

1931.卡片游戏

  • 2013年01月18日 14:08
  • 541B
  • 下载

【2048强势来袭】第三期:把卡片添加到游戏中

上一篇中,我们已经成功创建了卡片,下面我们就来把卡片添加到游戏中吧

卡片记忆安卓小游戏

  • 2015年10月29日 13:01
  • 10.03MB
  • 下载

VC/MFC卡片游戏

  • 2010年12月25日 13:41
  • 76KB
  • 下载

卡片游戏(Throwing cards away I)

Problem B: Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 a...

asp.net仿魔法卡片游戏源码

  • 2010年08月18日 15:51
  • 4.28MB
  • 下载

一个卡片游戏~我没玩懂

  • 2006年02月23日 09:05
  • 5.03MB
  • 下载

hdu 4550 卡片游戏

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4550 题目中文,就不解释题意了 这个题A后我也看过其他的解题报告,但是肿么有种感觉我的算法更容易理解的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:卡片游戏及解答程序
举报原因:
原因补充:

(最多只允许输入30个字)