第十四届北京师范大学程序设计竞赛热身赛第一场

题目链接: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 }
View Code

 

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 }
View Code

 

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 }
View Code

 

转载于:https://www.cnblogs.com/yepiaoling/p/5375562.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值