传智杯往届补题

补题链接

1-5届

https://www.nowcoder.com/exam/company

第六届

第六届初赛第一场:kotori和素因子

原题:kotori和素因子

题意:

给 n 个数,从每个数里面选它的一个质因子,要求每个数选的质因子都不一样,求这些质因子的最大累加和。

思路:

n <= 10 并且 a[i] <= 1000,数据范围很小,可以 dfs 搜索

  • 先求出每个数的质因子
  • 对每个数的质因子 dfs,如果每个数都取了一个质因子,取最大累加和


#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 1e9 + 7;

int T, n, m;
int ans=MOD;
void dfs(vector<vector<int>>& v,int x,int sum,set<int>& se)
{
    if(x==n)
    {
        ans=min(ans,sum);
        return;
    }
    for(int i:v[x])
    {
        if(se.find(i)==se.end())
        {
            se.insert(i);
            dfs(v,x+1,sum+i,se);
            se.erase(i);
        }
    }
}

void solve()
{
    cin>>n;
    vector<vector<int>> v(n);
    for(int i=0,temp;i<n;i++)
    {
        cin>>temp;
        for(int j=2;j*j<=temp;j++)
        {
            if(temp%j==0)
            {
                v[i].push_back(j);
                while(temp%j==0)temp/=j;
            }
        }
        if(temp>1)v[i].push_back(temp);
    }
    set<int> se;
    dfs(v,0,0,se);
    cout<<(ans==MOD?-1:ans);   
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    T = 1;
    //cin >> T;
    while (T--)
    {
        solve();
    }
    return 0;
}

第六届初赛第二场:小红取数

原题:小红取数

题意:

从 n 个数里取数,在满足所取数之和为 K 的倍数条件下,最大和是多少?

思路:

dp,每个数要么取,要么不取

dp[i][j] 表示取前 i 个数中,模 K 为 j 的最大和

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MOD=1e9+7;

int T,n,m;
void solve(){
	cin>>n>>m;
	vector<vector<int>> dp(n+1,vector<int>(m));
	for(int j=1;j<m;j++)dp[0][j]=-1e18-7;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		for(int j=0;j<m;j++)dp[i][j]=dp[i-1][j];//不取 x
		for(int j=0;j<m;j++)
			dp[i][(j+x)%m]=max(dp[i][(j+x)%m],dp[i-1][j]+x);//取 x
	}
	cout<<(dp[n][0]>0?dp[n][0]:-1);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	T=1;
	//cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

第六届初赛第二场:加减

原题:加减

题意:

给定 n 个数,一次操作可以对每个数加 1 或减 1,可以操作 k 次,问最后出现次数最多的数的出现次数最大可以是多少?

思路:

假设有 cnt 个数,最开始不一定都相等,但是可以通过 <= k 次操作使得这些数全都相等,那么目标数就是这些数的中位数,就可以使得操作次数最少;

操作数对应的下标对答案没有影响,那么就可以排序,使得每个数之间的差值尽量小,对于加或减到目标值的次数来说会更优;

如果存在长度为 len 的区间可以满足题意,那么一定就存在长度为 len-1 的区间满足题意,满足单调性,可以二分;

check 的时候可以用前缀和在 O(1) 时间内求出区间和。


#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 1e9 + 7;

int t, n, k, m;
int a[100005];
int sum[100005];
bool check(int limit)
{
	for(int i=1;i<=n-limit+1;i++)
	{
		int l=i,r=i+limit-1,mid=(l+r)/2,cnt=0;
		cnt+=(mid-l)*a[mid]-(sum[mid-1]-sum[l-1]);
		cnt+=(sum[r]-sum[mid])-(r-mid)*a[mid];
		if(cnt<=k)return 1;
	}
	return 0;     
}
void solve()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)
		sum[i]=sum[i-1]+a[i];
	int l=0,r=n,ans=0;
	while(l<=r)
	{
		int mid=(r-l)/2+l;
		if(check(mid))
		{
			l=mid+1;
			ans=mid;
		}
		else r=mid-1;
	}
	cout<<ans;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	t = 1;
	//cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}

第六届复赛第二场:小红的回文子串

原题:小红的回文子串

题意:

给定一个字符串,可以修改其中一个字符为任意字符,问字符串的长度为 3 的回文子串的数量最大是多少?

思路:

只能修改一个字符,那么就有两种情况了

  • s[i-2] = s[i+2], 但是 s[i] != s[i-2],这种情况可以多加 2 个
  • 在不影响原本数量的回文子串数量的情况下,最多可以再加 1 个,就是 s[i] != s[i+2] 的情况
    • 修改 s[i],看 s[i-2] 是否等于 s[i],或者 i-2 越界了
    • 修改 s[i+2],看 s[i+2] 是否等于 s[i+4],或者 i+4 越界了
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MOD=1e9+7;

int T,n,m;
void solve(){
	string s;
	cin>>s;
	int ans=0,sign=1;
	n=s.size();
	for(int i=0;i<n-2;i++)
		if(s[i]==s[i+2])ans++;
	for(int i=2;i<n-2;i++)
	{
		if(s[i-2]==s[i+2] && s[i]!=s[i-2]){
			cout<<ans+2;
			return ;
		}
	}
	for(int i=0;i<n-2;i++)
	{
		if(s[i]!=s[i+2] && (i+4>=n || s[i+2]!=s[i+4]))
		{
			ans++;
			break;
		}
		if(s[i]!=s[i+2] && (i-2<0 || s[i-2]!=s[i]))
		{
			ans++;
			break;
		}
	}
	cout<<ans;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	T=1;
	//cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
#牛客创作赏金赛#
全部评论

相关推荐

05-09 15:26
门头沟学院 Java
点赞 评论 收藏
分享
05-25 17:19
已编辑
门头沟学院 Java
岗位:武汉后台开发4.2投的长沙,服从调剂,被武汉捞了。笔试:选择题(计组,操作系统+语言题)+算法(2简单数组100%+1dfs,类似于岛屿数量但是就是不给我过)一面:4.22(11:30-11:50)20分钟自我介绍1.你讲一下HashMap的过程(数据结构+put过程)我提到了链表大于8不一定转化成红黑树,他就问什么时候不转化:链表小于8或者链表大于8且数组长度小于64,只会扩容。红黑树和HashMap的使用场景?这里有点忘了感觉说的不是很好,有点啰嗦混乱。2.你刚才提到了分布式限流,你讲一下。3.令牌桶的令牌怎么存?怎么取?4.你说的业务层面的令牌怎么存取,我想知道技术层面的(慌得一批,问蒙了)5.换一个吧,说说你负责的板块6.你这个项目中遇到的难点?怎么解决的?7.你的职业规划?8.说一下我输入一个url到浏览器,它的解析流程?9.反问技术栈?Go和容器编排对我和项目的建议?二面:4.28-19:30-20:10自我介绍先问问你1.如何设计一个支持1000万用户的实时排行榜系统?2.如果需要查询用户的具体排名(如全球第X名),如何实现?3.Redis有序集合(ZSet)的底层数据结构是什么?(这里我说了跳表,但是面试官不满意,让我通俗易懂的讲,我还是没讲清楚,就又让我讲底层数据结构怎么设计的)4.如何设计进程PID的分配和回收算法?5.位图算法在PID分配中的时间和空间复杂度分别是多少?(分配和回收的时间复杂度分开说)6.如何让UDP协议实现可靠传输?(参考tcp说的,说还有没有其他的,暂时没想出来)7.UDP协议的主要应用场景是什么?8.什么是死锁?通俗易懂的讲(这个会举例,然后就balabala)9.怎么解决你刚才说的这个例子的问题?怎么在程序中解决死锁问题?(前面太紧张了,只说了资源方面的,答得不是很全面,提醒我还可以规定顺序)手撕:分糖果2,点进去自动跳转平时写题的浏览器,写过,就又发了一道,反转链表2,又写过,让我删了重写,写出来就过了。秒最后面试官还说欢迎来武汉部门实习,人太好了这一关主要是遇到了牛客上之前大佬的面经,然后自己就留意了一下,而且主要是面试官人特别好HR面:4.30-11:00-11:15自我介绍对云智了解吗?(了解,学校开宣讲会也去听过)什么时候能来?有其他offer吗?为什么选择云智?实习薪资,福利介绍基本上闲聊,面试官也很好。总结:我主要是运气好,说一些其他能够给各位的经验或者分享吧。八股看的小林coding,CSDN,DeepSeek算法hot100操作系统:csdn计网:csdn目前工作体验:团队氛围很好,不懂的直接问,mt和ld&nbsp;都会很耐心的答疑解惑,非常有耐心,完全不用慌,而且留够了给我学习的时间,很不错!有需要的小伙伴可以:NTAAnwK(内推码)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
obbob:接好运
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

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