2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛)(ABDF解题报告)

版权声明:欢迎转载,转载请注明出处,如有错误,还望指出,谢谢 博客地址:https://blog.csdn.net/lanyanzhiji123asd https://blog.csdn.net/lanyanzhiji123asd/article/details/89072528

比赛链接:https://ac.nowcoder.com/acm/contest/553#question

A:

数学题,公式算一下就行

如果是double最后精确到整数不能用强制转换

会wa到自闭

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll x0,y0,r,x1,y1,y2;
    double AB,AL,temp,BG,DG,ans;
    cin>>x0>>y0>>r>>x1>>y1>>y2;
    AB=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
    temp=(y1-y2)*1.0/x1;
    AL=(y0-temp*x0-y2)/(sqrt(1+temp*temp));
//  cout<<AL<<endl;
    BG=sqrt(AB*AB-AL*AL);
    DG=sqrt(r*r-AL*AL);
    ans=(BG+DG)*(BG-DG);
    printf("%.0lf\n",ans);
     
    return 0;
}

B:

这个规律还挺好推的

每次不能超过已有的行数

那就每次复读已有的行数就是最大值

每次复读行数:   1     1      2     4     8

每次的总行数       1     2      4     8     16

扫描二维码关注公众号,回复: 6086071 查看本文章

所以规律就是每次都是前面的两倍

然后根据n找出次数就行

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll mp[50];
int main()
{
    ll n;
    int i;
    mp[0]=1;
    for(i=1;;i++)
    {
        mp[i]=2*mp[i-1];
        if(mp[i]>2e9)break;
    }
    while(cin>>n)
    {//cout<<"qqqqq   "<<i<<endl;
        int x=lower_bound(mp+1,mp+i,n)-mp;
        cout<<x<<endl;
    }
     
     
    return 0;
 }

D:

数学问题

正整数解就是m个数里面假设都有1

然后就是n-m分配到m个容器里面

就像是n-m个小球放进m个箱子里

非负整数解就是

n个小球放进m个箱子里

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
#define ll long long
using namespace std;
const ll mod=1e9+7;
 
ll qpow(ll a,ll b, ll p)
{
    ll res=1;
    while(b)
    {
        if(b%2!=0)
        {
            res*=a;
            res%=p;
             
        }
        a*=a;
        a%=p;
        b/=2;
    }
    return res;
}
 
ll c(ll n,ll m)
{
    int i;
     
    ll par=1,chi=n;
    for(i=1;i<=m;i++)
    {
        par*=i;
         
        if(i!=m)
            chi*=(n-i);
        par%=mod;
        chi%=mod;
    }
    par=qpow(par,mod-2,mod);
    return chi*par%mod;
}
 
int main()
{
    std::ios::sync_with_stdio(false);
    ll m,n;
    cin>>m>>n;
    cout<<c(n-1,m-1)<<" "<<c(m+n-1,m-1)<<endl;
 
 return 0;
}

F:

题目有点难懂

就是把x加进L~R里面   X的取值和概率

已经x没加进L~R里面,X的取值和概率

最后求X的期望

然后用前缀和维护下。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
#define ll long long
int mp[100005],qianz[100005];
int main()
{
    int n,q,x,L,R,temp,i,j;
    double sum1,sum2,ans;
    scanf("%d %d",&n,&q);
        memset(qianz,0,sizeof(qianz));
        for(i=1;i<=n;i++)
        {
            cin>>mp[i];
            qianz[i]=qianz[i-1]+mp[i];
        }
        for(i=0;i<q;i++)
        {
            temp=0;
            scanf("%d %d %d",&x,&L,&R);
            temp=qianz[R]-qianz[L-1];
            sum1=temp*1.0/(R-L+1);
            sum1*=(n-R+L-1)*1.0/n;
            sum2=(temp+x)*1.0/(R-L+1);
            sum2*=(R-L+1)*1.0/n;
            ans=sum1+sum2;
            printf("%.7f\n",ans);
        }
  
  
 return 0;
}

猜你喜欢

转载自blog.csdn.net/lanyanzhiji123asd/article/details/89072528