牛客小白月赛1 【题解完成】

87 阅读6分钟
题目难度知识点
A 简单题简单数学
B 简单题2简单数学
C 分元宵快速幂
D 多项式乘法模拟
E 圆与三角形tan用法
F 三视图模拟
G あなたの蛙は旅⽴っています★★★动态规划(DP)
H 写真がとどいています模拟
I あなたの蛙が帰っています★★卡特兰数
J おみやげをまらいました模拟

简单题

image.png 没啥说的,根据题目可以退出极限的值是e。然后模拟就行了。 需要记住的是e的值,很难记住,故记住推理公式会更好。

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    double sum=2.718281828459045;
    int t; cin>>t;
    while(t--)
    {
        int a,b,r; cin>>a>>b>>r;
        double ans=1;
        for(int i=1;i<=a;i++) ans*=sum;
        ans*=b;
        if(r==1) printf("%.1lf\n",ans);
        if(r==2) printf("%.2lf\n",ans);
        if(r==3) printf("%.3lf\n",ans);
        if(r==4) printf("%.4lf\n",ans);
        if(r==5) printf("%.5lf\n",ans);
    }
    return 0;
}

image.png

#include<bits/stdc++.h>
using namespace std;
double f(int n)
{
    double sum=0;
    double a=1.0;
    for(int i=1;i<=n;i++)
    {
        sum+=1.0/a;
        a=a*i;
    }
    return sum;
}
int main(void)
{
    
    int t; cin>>t;
    double sum=f(105);
    while(t--)
    {
        int a,b,r; cin>>a>>b>>r;
        double ans=1;
        for(int i=1;i<=a;i++) ans*=sum;
        ans*=b;
        if(r==1) printf("%.1lf\n",ans);
        if(r==2) printf("%.2lf\n",ans);
        if(r==3) printf("%.3lf\n",ans);
        if(r==4) printf("%.4lf\n",ans);
        if(r==5) printf("%.5lf\n",ans);
    }
    return 0;
}

简单题2

image.png

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        double a,b,r; cin>>a>>b>>r;
        double sum=pow(a,2.718281828459045)/b;
        if(r==1) printf("%.1lf\n",sum);
        if(r==2) printf("%.2lf\n",sum);
        if(r==3) printf("%.3lf\n",sum);
        if(r==4) printf("%.4lf\n",sum);
        if(r==5) printf("%.5lf\n",sum);
    }
    return 0;
}

分元宵

image.png

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL a,b,c,d,p;
LL quick_sort(LL a,LL b,LL p)
{
    LL sum=1;
    while(b)
    {
        if(b&1) sum=sum*a%p;
        a=a*a%p;
        b=b>>1;
    }
    return sum%p;
}
int main(void)
{
    cin>>a>>b>>c>>d>>p;
    cout<<quick_sort((a%p)*(b%p)%p,c*d,p);
    return 0;
}

多项式乘法

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int a[N],b[N],c[N],n,m;
int main(void)
{
    cin>>n>>m;
    for(int i=0;i<=n;i++) cin>>a[i];
    for(int i=0;i<=m;i++) cin>>b[i];
    for(int i=0;i<=n;i++)
        for(int j=0;j<=m;j++)
                c[i+j]+=a[i]*b[j];
    for(int i=0;i<=n+m;i++) cout<<c[i]<<" ";
    return 0;
}

圆与三角形

image.png

double tan(double x);
`x`:以弧度为单位的角度值。类型为 `double`
1度=pi/180
#include<bits/stdc++.h>
using namespace std;
const double pi=acos(-1.0);
int main(void)
{
    double r; cin>>r;
    double ans=0;
    for(int i=1;i<180;i++)
    {
        for(int j=1;j<180;j++)
        {
            int z=180-i-j;
            if(z<=0) continue;
            double a=i*pi/180;
            double b=j*pi/180;
            double c=z*pi/180;
            double temp=tan(a/2)*tan(b/2)+
                        tan(b/2)*tan(c/2)+
                        tan(a/2)*tan(c/2)+
                        sin(a)*r;
            ans=max(ans,temp);
        }
    }
    printf("%.2lf",ans);
    return 0;
}

三视图

image.png 就是模拟,需要注意的是输出。

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
const int M=1e5+10;
int a[N][N],b[N][N],c[N][N];
int x,y,z,n;
struct node
{
    int x,y,z;
}Node[M];
int main(void)
{
    cin>>x>>y>>z>>n;
    for(int i=0;i<n;i++)
    {
        int xx,yy,zz; cin>>xx>>yy>>zz;
        Node[i].x=xx,Node[i].y=yy,Node[i].z=zz;
    }
    for(int i=0;i<n;i++)
    {
        int xx=Node[i].x;
        int yy=Node[i].y;
        int zz=Node[i].z;
        a[y-yy+1][xx]++;
    }
    for(int i=0;i<n;i++)
    {
        int xx=Node[i].x;
        int yy=Node[i].y;
        int zz=Node[i].z;
        b[y-yy+1][zz]++;
    }
     for(int i=0;i<n;i++)
    {
        int xx=Node[i].x;
        int yy=Node[i].y;
        int zz=Node[i].z;
        c[zz][xx]++;
    }
    for(int i=1;i<=y;i++)
    {
        for(int j=1;j<=x;j++)
        {
            if(a[i][j]) cout<<'x';
            else cout<<'.';
        }
        cout<<" ";
        for(int j=1;j<=z;j++)
        {
             if(b[i][j]) cout<<'x';
            else cout<<'.';
        }
        puts("");
    }
    puts("");
    for(int i=1;i<=z;i++) 
    {
        for(int j=1;j<=x;j++) 
        {
            if(c[i][j]) cout<<'x';
            else cout<<".";
        }
        puts("");
    }
    return 0;
}

あなたの蛙は旅⽴っています

image.png 就是简单的DP,但是问题的难点在于1.如何输入2.如何将其输入的数据压入到二维的数组中。

image.png

image.png 上图便是,每次从每一行队列中第一个数字取出来,放到第i列的2维数组中去。

#include<bits/stdc++.h>
using namespace std;
const int N=5010;
long long int dp[N][N],n;
long long int cnt[N],cnt1[N];
//cnt[i]是存的每一行该输入多少个数字,可以找规律。
//1, 1                    4*n-3行
//2, 1 2 1 2 1
//3, 1 2 3 2 3 2 3 2 1
//cnt1[i]存的二维数组中每一列该有个数字,可以找规律。
int main(void)
{
    cin>>n;
    memset(dp,-0x3f3f3f3f,sizeof(dp));
    for(int i=1;i<=n;i++) cnt[i]=i;
    for(int i=4*n-3,j=1,z=1;j<=n;i--,j++,z++) cnt[i]=z;
    int flag=n-1;
    for(int i=n+1;!cnt[i];i++)
    {
        cnt[i]=flag;
        if(flag==n-1) flag=n;
        else flag=n-1;
    }
    for(int i=1,k=n;i<=n;i++,k++) cnt1[i]=k;
    for(int i=n+1,j=1,k=n*2-2;j<=n-1;i++,j++,k--) cnt1[i]=k;
    deque<int>q[n*10+10];
    for(int i=1;i<=4*n-3;i++)
    {
        for(int j=1;j<=cnt[i];j++)
        {
            int x; cin>>x;
            q[i].push_back(x);
        }
    }
    for(int i=1;i<=n;i++)
    {
        vector<int>ve;
        for(int j=1;j<=4*n-3;j++)
        {
            if(q[j].size())
            {
                ve.push_back(q[j].front());
                q[j].pop_front();
            }
            if(ve.size()==cnt1[i]) break;
        }
        for(int j=1;j<=cnt1[i];j++) dp[j][i]=ve[j-1];
    }
    for(int i=n+1,k=2;i<=2*n-1;i++,k++)
    {
        vector<int>ve;
        for(int j=1;j<=4*n-3;j++)
        {
            if(q[j].size())
            {
                ve.push_back(q[j].front());
                q[j].pop_front();
            }
            if(ve.size()==cnt1[i]) break;
        }
        for(int j=1,z=k;j<=cnt1[i];j++,z++) dp[z][i]=ve[j-1];
    }
    for(int i=2;i<=n*2-1;i++)
    {
        if(dp[1][i]>-50000) dp[1][i]+=dp[1][i-1];
    }
    for(int i=2;i<=n*2-1;i++) if(dp[1][i]>-50000) dp[i][1]+=dp[i-1][1];
    for(int i=2;i<=n*2-1;i++)
    {
        for(int j=2;j<=n*2-1;j++)
        {
            if(dp[i][j]>-50000)
            {
                long long int temp=dp[i][j];
                dp[i][j]=max({dp[i][j-1]+temp,dp[i-1][j-1]+temp,dp[i-1][j]+temp});
            }
        }
    }
    cout<<dp[n*2-1][n*2-1];
    return 0;
}

写真がとどいています

image.png 垃圾题目,还考察五线谱,对于不懂这方面的人根本不行。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    char a[15][N];
    int n;
    int main(void)
    {
        cin>>n;
        for(int i=1;i<=9;i++)
            for(int j=1;j<=n;j++) cin>>a[i][j];
        vector<char>ans;
        map<int,char>mp;
        mp[1]='F',mp[2]='E',mp[3]='D',mp[4]='C',mp[5]='B',mp[6]='A',mp[7]='G',mp[8]='F',mp[9]='E';
        for(int i=1;i<=n;i++)
        {
            int flag=0;
            for(int j=1;j<=9;j++)
            {
                if(a[j][i]=='o')
                {
                    ans.push_back(mp[j]);
                    flag=1;
                }
            }
            if(!flag) ans.push_back('|');
        }
        for(int i=0;i<ans.size();i++) cout<<ans[i];
        return 0;
    }

あなたの蛙が帰っています

image.png

image.png

image.png 需要预处理,不然每次计算会卡。

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
const int N=1e5*5+10;
typedef long long int LL;
LL c[N],a[N],b[N];
LL quick_mi(LL a,LL b,LL p)
{
    LL sum=1;
    while(b)
    {
        if(b&1) sum=(sum%p)*(a%p)%p;
        a=(a%p)*(a%p)%p;
        b=b>>1;
    }
    return sum%p;
}
void init()
{
    a[0]=1,b[0]=1;
    for(int i=1;i<=1e5*2;i++)
    {
        a[i]=(a[i-1]*i)%mod;
        b[i]=(b[i-1]*quick_mi(i,mod-2,mod))%mod;
    }
    for(int i=1;i<=1e5*2;i++)
    {
        c[i]=(a[i*2]*b[i])%mod;
        c[i]=(c[i]*b[i])%mod;
        c[i]=c[i]*quick_mi(i+1,mod-2,mod)%mod;
    }
}
int main(void) {
    init();
    int t;
    scanf("%d", &t);
    for (int i = 1; i <= t; i++) {
        LL n; scanf("%lld", &n);
        LL ans = (c[n] - c[n - 1] + mod) % mod;
        printf("Case #%d: %lld\n", i, ans);
    }
    return 0;
}

おみやげをまらいました

image.png

#include<bits/stdc++.h>
using namespace std;
map<string,string>mp;
map<string,int>st;
int main(void)
{
    for(int i=0;i<3;i++)
    {
        string a,b; cin>>a>>b;
        st[a]++,st[b]++;
        mp[b]=a;
    }
    int t; cin>>t;
    while(t--)
    {
        string s; cin>>s;
        if(st[s]==0) puts("Fake");
        else cout<<mp[s]<<endl;
    }
    return 0;
}