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;
}