卡片游戏及解答程序

卡片游戏
程序文件名 : 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();
}

 

                  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值