2025牛客寒假算法基础集训营2

C.字符串外串

题目:
牛可乐定义字符串 s 的可爱度为最大的整数 k,满足存在一个长度为 k 的连续子串a和一个长度为 k的不连续子序列b,满足 a=b。给你两个整数 n,m,并且询问你是否存在长度为 n、仅由小写字母构成的字符串 t,使得 t 的可爱度恰好等于 m。如果存在,输出任意一个符合条件的字符串 t。

思路:找出无解条件,由于所构造的答案只与前后两侧的 a-z强相关,取模,只需要不停的塞入长度为 n−m 的 a-z 即可。

#include<bits/stdc++.h>
using namespace std;
int sum=0;
void slove()
{
	int n,m; cin>>n>>m;
	int f=1;
	if(n<=m||n-m>26) f=0;
	if(f)
	{
		cout<<"YES"<<endl;
		for(int i=0;i<n;i++)
		{
			cout<<char('a'+i%(n-m));
		}
		cout<<endl;
	}
	else cout<<"NO"<<endl;
	
}
int main()
{
	int t; cin>>t;
	while(t--)
	{
		slove();
	}
}

D.字符串里串

题目:给一个字符串可爱度k,在其中找到一个字串和不连续子串长度均为k的最大k

思路:贪心构造,第一段仅包含一个字符,即 a 的第一个字母,去位置前寻找;第二段包含 aa的剩余部分,可以共用这部分;或反之。

#include<bits/stdc++.h>
using namespace std;
int sum=0;
int main()
{
	int n; cin>>n;
	string a; cin>>a;
	for(int i=0;i<26;i++)
	{
		int c=0,d=0;
		for(int j=0;j<n;j++)
		{
			if(a[j]-'a'!=i) continue;
			if(c!=0) sum=max(sum,n-j);
			c++;
		}
		for(int j=n-1;j>=0;j--)
		{
			if(a[j]-'a'!=i) continue;
			if(d!=0) sum=max(sum,j+1);
			d++;
		}
	}
	if(sum>1) cout<<sum;
	else cout<<0;
}

H. 一起画很大的圆!

题目:给一个矩形边界,在其中找三个点始三点画出的圆半径最大

思路:长边上选取两个点,短边上选取一个点,且尽可能的靠近长边;

#include<bits/stdc++.h>
using namespace std;
void slove()
{
	int a,b,c,d; cin>>a>>b>>c>>d;
	//a,d左上
	//b,d右上
	//a,c左下
	//b,c右下
	if(b-a>d-c)
	{
		cout<<a<<' '<<d<<endl;
		cout<<a+1<<' '<<d<<endl;
		cout<<b<<' '<<d-1<<endl;
	}
	else 
	{
		cout<<a<<' '<<d<<endl;
		cout<<a<<' '<<d-1<<endl;
		cout<<a+1<<' '<<c<<endl;
	}
}
int main()
{
	int t; cin>>t;
	while(t--)
	{
		slove();
	}
}

J. 数据时间?

题目
牛可乐正在分析最近几个月用户登录牛客 APP 的情况,他所收集的数据由三个字段构成,分别为:user_id 表示用户 ID,login_date表示登录日期,login_time 表示登录时间
由于牛可乐同时还在忙着演奏■■■、去牛妹家吃一勺饭、钻研可爱的字符串……所以他想请你帮助他统计 hhh 年 mmm 月份通勤、午休、临睡这三个时段各有多少人登录过 APP。特别地,同一个人在同一时段多次登录视作一次。

在本题中,通勤时间段为 07:00:00-09:00:00和 18:00:00-20:00:00;午休时间段为 11:00:00-13:00:00;临睡时间段为 22:00:00-01:00:00。时间段均包含左右边界值。

思路:模拟

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,h,m; cin>>n>>h>>m;
	string s=to_string(h)+"-";
	if(m>=10) s=s+to_string(m);
	else s=s+"0"+to_string(m);
	set<string> a,b,c;
	while(n--)
	{
		string id,date,time;
		cin>>id>>date>>time;
		if(date.substr(0,7)!=s) continue;
		string h=time.substr(0,2);
		if(h=="07"||h=="08"||time=="09:00:00"||
		   h=="18"||h=="19"||time=="20:00:00")  a.insert(id);
		if(h=="11"||h=="12"||time=="13:00:00")  b.insert(id);
		if(h=="22"||h=="23"||h=="00"||time=="01:00:00")  c.insert(id);
	}
	cout<<a.size()<<" "<<b.size()<<" "<<c.size();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值