[TB-Exam]求命中率的一个题

一个'U','G'的序列,每个位置的猜测根据其前N个字符的‘U’or'G'的相对数目中较大(相等时以U猜)的,求猜测的最终的命中率

[解答]

/******************************************************************* * * DESCRIPTION:TaoBao 20091012 BUPT * * AUTHOR:Neesky * * DATE:2009-10-12 * *******************************************************************/ /** include files **/ #include <iostream> using namespace std; /*Global Variables*/ char UGA[4]={'U','U','G','G'}; /// <summary> /// [Core Function] /// ArrayARight数组用于记录命中的次数,ArrayATimes数组用于记录输入数组中U出现的次数 /// </summary> /// <param name="N">根据前面的N个输入来决策是猜N还是猜G</param> /// <param name="M"></param> /// <param name="_UGA"></param> /// <returns></returns> void GetRightRate(int N, int M, char *_UGA ) { assert(N>=1&&N<=M); int ArrayARight[M],ArrayATimes[M]; cout<<"UGA :"; for(int k=0;k<M;++k){ArrayARight[k]=ArrayATimes[k]=0; cout<<_UGA[k]<<" ";} //初始并输出输入的数组 ArrayARight[0]=ArrayATimes[0]=(_UGA[0]=='U'?1:0); cout<<"/nGUS :U "; for(int i=1; i<M; ++i) { if(ArrayATimes[i-1]*2>=N) //Guess U { cout<<"U "; ArrayARight[i]=_UGA[i]=='U'?ArrayARight[i-1]+1:ArrayARight[i-1]; } else //Guess as G { cout<<"G "; ArrayARight[i]=_UGA[i]=='G'?ArrayARight[i-1]+1:ArrayARight[i-1]; } int t=(i>N)&&(_UGA[i-N])?1:0; ArrayATimes[i]=_UGA[i]=='U'?ArrayATimes[i-1]+1-t:ArrayATimes[i-1]-t; //已知U出现的次数 } cout<<"/nRAT(N="<<N<<"): "<<((float)ArrayARight[N-1]/(float)M)*100<<"%"<<endl; return; } /// <summary> /// Main Programming /// </summary> /// <param name="argc"></param> /// <param name="argv"></param> /// <returns></returns> int main (int argc, char *argv[]) { GetRightRate(1,4,UGA); return(0); }  

[输出]

 

make -f "Makefile" CFG=Debug
g++ -c -g -o "Debug/Taobao20091012.o" "Taobao20091012.cpp"
g++ -g -o "Debug/Taobao20091012.exe" Debug/Taobao20091012.o
Debug/Taobao20091012.exe
UGA :U U G G
GUS :U U U U
RAT(N=1): 25%

 

你可能感兴趣的:(Date,function,include,float,makefile,variables)