题解(自记录) | 牛客寒假集训营20250123第二场比赛

A.一起奏响历史之音!

题目:https://ac.nowcoder.com/acm/contest/95334/A

#include<bits/stdc++.h>

using namespace std;

int main(){

int a[5]={1,2,3,5,6};

int x;string l="YES";

for(int i=0;i<7;i++){

cin >> x;

if(find(a,a+5,x)==a+5){

l="NO";

}

}

cout << l;

}

题解思路:相当于判断输入数组中有没有除去1,2,3,5,6以外的其他元素,构建一个数组并查找输入过程中是否存在以外的数即可

B.能去你家蹭口饭吃吗

题目:https://ac.nowcoder.com/acm/contest/95334/B

#include<bits/stdc++.h>

using namespace std;

bool cmp(int x,int y){

return x>y;

}

int main(){

int n,ans;

cin >> n;

vector<int>a(n);

for(int i=0;i<n;i++){

cin >> a[i];

}

sort(a.begin(),a.end(),cmp);

if(n%2==0){

ans=a[n/2-1]-1;

}

else{

ans=a[n/2]-1;

}

cout << ans;

}

题解思路:依题意可知为求其中位数,排序后输出中间位即可。

C.字符串外串

题目:https://ac.nowcoder.com/acm/contest/95334/C

D.字符串里串

题目:https://ac.nowcoder.com/acm/contest/95334/D

#include<bits/stdc++.h>

#define ll long long

using namespace std;

int main() {

string s;int n,ans=0;

cin >> n >> s;

s=" "+s;

set<int>a;

for(int i=n;i>=2;i++){

if(a.count(s[i]))ans=max(ans,i);

a.insert(s[i]);

}

a=set<int>();

for(int i=1;i<=n-1;i++){

if(a.count(s[i]))ans=max(ans,n-i-1);

a.insert(s[i]);

}

cout << ans << endl;

}

题解思路:需要连续数组a和不连续数组b相同,那么可以记录每个数字出现的频率,如果出现过则记录当前重复数字的下标,从前往后和从后往前各一次找出哪个最长

E.一起走很长的路!

题目:https://ac.nowcoder.com/acm/contest/95334/E

F.一起找神秘的数!

题目:https://ac.nowcoder.com/acm/contest/95334/F

#include<bits/stdc++.h>

using namespace std;

#define ll long long

int main() {

int T;

cin >> T;

while(T--){

ll x,y;

cin >> x >> y;

cout << y-x+1 <<endl;

}

}

题解思路:(x&y)+(x|y)等同于x+y,那么当(x^y)==0时仅有x==y所以等同于区间之和

G.一起铸最好的剑!

题目:https://ac.nowcoder.com/acm/contest/95334/G

#include<bits/stdc++.h>

#define ll long long

using namespace std;

int main(){

ll T,n,m,res1,res2;

cin >> T;

while (T--) {

ll ans=1;

cin >> n >> m;

ll d=m;

res1=n-d;

d=d*m;

res2=n-d;

while(abs(res1)>abs(res2)){

ans++;res1=res2;

d=d*m;res2=n-d;

}

cout << ans <<endl;

}

}

题解思路:起始温度为m,添柴次数为1,每次添柴后乘上m,计算每次添柴后与目标温度的距离若小于添柴前,则输出当前添柴次数。

H.一起画很大的圆!

题目:https://ac.nowcoder.com/acm/contest/95334/H

#include<bits/stdc++.h>

#define ll long long

using namespace std;

int main() {

int T;

cin>>T;

while(T--){

ll a,b,c,d;

cin >> a >> b >> c >> d;

if(b-a>d-c){

cout << a <<" " << d-1 << endl;

cout << b <<" " << d << endl;

cout <<b-1 << " "<< d <<endl;

}

else{

cout << b-1 <<" "<< d<<endl;

cout << b <<" "<<c<<endl;

cout << b <<" "<< c+1<< endl;

}

}

}

题解思路:首先输出为整数类型,那就不必考虑浮点数,随机在矩形上取三个点,取两个在长边上的点和一个短边上的点,由正弦定理和外切圆的定义可得长边上的两个点越接近,短边上的点越接近长边,且与另外两个点越远时外切圆最大

I.一起看很美的日落!

题目:https://ac.nowcoder.com/acm/contest/95334/I

J.数据时间?

题目:https://ac.nowcoder.com/acm/contest/95334/J

#include<bits/stdc++.h>

#define ll long long

using namespace std;

int main() {

int n,h,m;

cin >> n >> h >>m;

set<string>A,B,C;

while(n--){

string id;int ye,mon,day,hou,min,s,num;

cin >>id;

scanf("%d-%d-%d %d:%d:%d",&ye,&mon,&day,&hou,&min,&s);

if(ye!=h||m!=mon)continue;

num=hou*3600+min*60+s;

if((25200<=num&&num<=32400)||(64800<=num&&num<=72000)){

A.insert(id);

}

else if(39600<=num&&num<=46800){

B.insert(id);

}

else if((79200<=num&&num<=86400)||(0<=num&&num<=3600)){

C.insert(id);

}

}

cout << A.size() <<" " << B.size() <<" "<<C.size()<<endl;

}

题解思路:按照题目同一个人的相同时间段仅算一次,开一个set容器,将输入进来的数据先判断年份和月份是否正确,在将时间全转换为秒进行分类。

K.可以分开吗?

题目:https://ac.nowcoder.com/acm/contest/95334/K

#include<bits/stdc++.h>

#define ll long long

using namespace std;

vector<vector<int>>vis;

vector<pair<int,int>>p={{-1,0},{1,0},{0,1},{0,-1}};

vector<string>a;

set<pair<int,int>>st;

int n,m;

int main() {

cin >> n >> m;

a=vector(n+2,string(m+2,'0'));

for(int i=0;i<n;i++){

cin >> a[i];

// a[i]='0'+a[i]+'0';

}

vis=vector(n+2,vector<int>(m+2));

int ans=1e9;

void dfs(int x,int y);

for(int i=0;i<n;i++){

for(int j=0;j<m;j++){

if(vis[i][j])continue;

if(a[i][j]=='0')continue;

st.clear();

dfs(i,j);

ans=min(ans,(int)st.size());

}

}

cout << ans <<endl;

}

void dfs(int x,int y){

int xx,yy;

vis[x][y]=1;

for(auto&[dx,dy]:p){

xx=dx+x;

yy=dy+y;

if(xx<0||xx>n-1||yy<0||yy>m-1)continue;

if(vis[xx][yy])continue;

if(a[xx][yy]=='0')st.insert({xx,yy});

else dfs(xx,yy);

}

}

题解思路:题目要求分离出一个蓝色极大联通块,那么先找出蓝色区块的位置,找出后通过dfs探测周边需要敲碎的灰色区块,并找出最小需要敲碎的数量

L.还会再见吗?

题目:https://ac.nowcoder.com/acm/contest/95334/L

M.那是我们的影子

题目:https://ac.nowcoder.com/acm/contest/95334/M

全部评论

相关推荐

12-11 23:05
武汉大学 Java
点赞 评论 收藏
分享
zzzilik:四个月实习做了3个项目不觉得很假吗,真没必要写这么多吧我感觉挑点核心的重点写一下我感觉会好点
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务