2024牛客寒假训练营第一场个人补题

B - 关鸡

原题链接:B-关鸡_2024牛客寒假算法基础集训营1 (nowcoder.com)

知识点:按位异或

题目描述:

思路:

不难看出答案范围是0,1,2,3之间,最坏的情况就是(2,0)、(1,-1)、(1,1)将这三点堵住,这种情况也是唯一需要特殊考虑的。正常情况则是判断鸡的两侧是否有着火点,以及进一步的是否存在上下两行的列数差从-1~1的着火点。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
signed main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        set<pair<int,int>> s;
        int num1=2,num2=2;
        while(n--)
        {
            int r,c;
            cin>>r>>c;
            s.insert({r,c});
            if(c<=0)
                num1=1;
            if(c>=0)
                num2=1;
        }

        for(auto [r,c] : s)
        {
            for(int i=-1;i<=1;i++)
            {
                if(s.count({r^3,c+i}))//通过将行数与‘3’进行按位异或,得到另一行数
                {
                    if(c<0)
                        num1=0;
                    if(c>0)
                        num2=0;
                }
            }
        }
        int num=3-s.count({2,0})-s.count({1,-1})-s.count({1,1});
        int x=min(num,num1+num2);
        cout<<x<<endl;
    }
    return 0;
}

E- 本题又主要考察了贪心 

原题链接 :E-本题又主要考察了贪心_2024牛客寒假算法基础集训营1 (nowcoder.com)

题意

思路:

别被题目名字误导,其实数据并不多,直接dfs就可以做出来。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

int a[15];
pair<int,int> p[15];
int n,m,num;

void dfs(int k)
{
    if(k==m+1)
    {
        int l=1;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>a[1])
                l++;
        }
        num=min(num,l);
        return;
    }
    else
    {
        int x=p[k].first,y=p[k].second;
        //x赢
        a[x]+=3;
        dfs(k+1);
        a[x]-=3;
        //y赢
        a[y]+=3;
        dfs(k+1);
        a[y]-=3;
        //平局
        a[x]+=1;
        a[y]+=1;
        dfs(k+1);
        a[x]-=1;
        a[y]-=1;
    }
}
signed main()
{
    int t;
    cin>>t;
    while(t--)
    {
        num=15;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(int i=1;i<=m;i++)
        {
            int x,y;
            cin>>x>>y;
            p[i].first=x;
            p[i].second=y;
        }
        dfs(1);
        cout<<num<<endl;
    }
}

L- 要有光

原题链接:L-要有光_2024牛客寒假算法基础集训营1 (nowcoder.com)

题意:

思路:

很简单,太阳越贴近地面阴影越大,所以计算最大阴影面积即是两墙面与太阳构成的梯形的面积。而太阳到绿墙和绿墙到白墙的距离相等,这就是一个相似三角形,所以绿墙宽2w,白墙阴影部分宽4w,高为c,面积(2w+4w)/2*c=3*c*w;

代码:

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
signed main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int c,d,h,w;
        cin>>c>>d>>h>>w;
        cout<<fixed<<setprecision(6)<<3*w*c<<endl;
    }
}

I - It's bertrand paradox. Again!

原题链接:I-It's bertrand paradox. Again!_2024牛客寒假算法基础集训营1 (nowcoder.com)

题意:

思路:

bit和buaa两者的生成方式不同,前者为先取圆心,再找到合适的半径,以至于生成的园的圆心应是平均分布;而后者为圆心和半径同时重新生成,以至于合适的点更多地集中在199*199这个区域的中心,成正态分布。所以我们要找到一个统计量将两者区分开。

代码:

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
signed main()
{
    int n;
    cin>>n;
    int x,y,r;
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        cin>>x>>y>>r;
        if(abs(x)<=70 && abs(y)<=70)
            sum++;//正态分布所以圆心在-70~70之间的点会明显更多
    }               //统计其个数
    double a=141*141*1.0/199/199*1e5;//按概率算1e5个圆出现在上述区域的个数
    if(sum-a>2000)//统计个数明显多于概率个数则为正态分布
        cout<<"buaa-noob"<<endl;
    else
        cout<<"bit-noob"<<endl;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值