题目链接:www.bnuoj.com/v3/contest_show.php?cid=7729
A. Liserious战队--打表
根据达到每一级所需要的经验打表s,然后计算出所的经验sum,将sum与s进行比较,直接输出下标。
1 /*A*/ 2 #include<cstdio> 3 using namespace std; 4 5 int main() 6 { 7 int s[100+10]; 8 s[2]=4;s[1]=0; 9 for(int i=3;i<110;i++) 10 s[i]=s[i-1]+i*i; 11 int N; 12 int K,M; 13 while(scanf("%d",&N)!=EOF) 14 { 15 int sum=0; 16 for(int i=0;i<N;i++) 17 { 18 scanf("%d%d",&K,&M); 19 sum+=K*M; 20 } 21 int ans; 22 for(int i=1;i<=99;i++) 23 if(sum>=s[i]) 24 ans=i; 25 printf("Team Liserious' rank is %d\n",ans); 26 } 27 return 0; 28 }
B. 数细菌——公式
由a,b我们可以将第一天的细菌分为两部分。第一部分x,这些细菌会在第偶数天分裂,第二部分则是在奇数天。在n天中,p=n/2就是x会分裂的次数,q=(n-1)/2是y会分裂的次数。
当p==q时,n天之后的细菌数是ans=log10((double)(x+y))+(double)p*log10(3);当p!=q时,ans=log10((double)(3*x+y))+(double)q*log10(3)。这两个 公式根据对数的运算就可以推出来。
1 /*B*/ 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 6 int main() 7 { 8 int T; 9 long long a,b,n; 10 scanf("%d",&T); 11 while(T--) 12 { 13 scanf("%lld%lld%lld",&a,&b,&n); 14 long long x=(b-a)/2,y=a-x; 15 long long p=n/2,q=(n-1)/2; 16 double ans; 17 if(p==q) 18 ans=log10((double)(x+y))+(double)p*log10(3); 19 else 20 ans=log10((double)(3*x+y))+(double)q*log10(3); 21 22 23 printf("%.10lf\n",ans); 24 } 25 return 0; 26 }
C. 方(芳)格(哥)取数
这个题目很有意思,你可以输入数据,然后根据系统的输出来得到信息。题意是问一个N*M的矩阵,是否有一个格子的值等于K。这个矩阵中值的特点是从左到右增加,从上到下增加,你要在N+M次询问中判断是否有这个值。根据这个矩阵中值的特点,我们可以从右上角开始询问,当给出的值小于要K时,我们则向左询问,否则向下询问。
1 #include<cstdio> 2 using namespace std; 3 4 int main() 5 { 6 int T; 7 int N,M,K; 8 scanf("%d",&T); 9 while(T--) 10 { 11 scanf("%d%d%d",&N,&M,&K); 12 int X=1,Y=M; 13 int H; 14 int flag=0; 15 while(1) 16 { 17 printf("%d %d\n",X,Y);fflush(stdout); 18 scanf("%d",&H); 19 if(H==K) 20 { 21 flag=1; 22 break; 23 } 24 else 25 { 26 if(H>K) 27 { 28 X=X;Y--; 29 if(Y<1){ 30 flag=0;break; 31 } 32 } 33 else 34 { 35 X++;Y=Y; 36 if(X>N){ 37 flag=0;break; 38 } 39 } 40 } 41 } 42 if(flag==1) 43 { 44 printf("YES\n");fflush(stdout); 45 } 46 else 47 { 48 printf("NO\n");fflush(stdout); 49 } 50 } 51 return 0; 52 }