1. 程式人生 > >算法復習——猜數問題

算法復習——猜數問題

out line images lag nbsp while mes amp 研究

技術分享

技術分享

  上面這道題的四個KC的分類範圍的解題方法可以直接在龍凡的《一類猜數問題的研究》找到··為了版權問題我這裏就不貼了···

  代碼:

  

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include
<algorithm> using namespace std; inline long long R(){ char c;long long f=0; for(c=getchar();c<0||c>9;c=getchar()); for(;c<=9&&c>=0;c=getchar()) f=f*10+c-0; return f; } int T; long long n,k,c; long long f1=0,f2[80000][105],f3[505],f4[70000][105]; int main() { T
=R(); while(T--){ n=R(),k=R(),c=R(); if(n==k&&c==0){ f1=0;int tim=0; while(f1<n){ f1=2*f1+1; tim++; } cout<<tim<<"\n"; } else if(c==0){ bool flag=false
; for(int i=1;;i++){ if(flag) break; for(int j=1;j<=k;j++){ f2[i][j]=f2[i-1][j-1]+f2[i-1][j]+1; if(f2[i][j]>=n){ cout<<i<<"\n";flag=true; break; } } } } else if(n==k&&c!=0){ for(int i=2;;i++){ f3[i]=f3[i-1]+f3[i-2]+1; if(f3[i]>=n){ cout<<i<<"\n"; break; } } } else{ bool flag=false; for(int i=2;;i++){ if(flag) break; for(int j=1;j<=k;j++){ if(j>1)f4[i][j]=max(f4[i-1][j-1]+f4[i-2][j],f4[i-2][j-2]+f4[i-1][j])+1; else f4[i][j]=max(f4[i-1][j-1]+f4[i-2][j],f4[i-1][j])+1; if(f4[i][j]>=n){ cout<<i<<endl; flag=true;break; } } } } } return 0; }

算法復習——猜數問題