2024.08.24阿里灵犀互娱
1. 减一
给出一组数,求出最长的子串。使得这个子串中的数最大值和最小值的差值最大为1。
如1 5 4 1 2 4 2 5 5。最长子串为5 4 4 5 5,长度为5
红黑树计数即可
int main(int argc, char *argv[]) {
int n;
cin>>n;
vector<int> nums(n);
map<int,int> m;
for(int i=0;i<n;i++){
cin>>nums[i];
m[nums[i]]++;
}
int res = 0;
for(auto &[key,val]:m){
if(m.count(key+1)) res = max(res,m[key]+m[key+1]);
res = max(res,m[key]);
}
cout<<res;
return 0;
}
2. 小杰的灵犀之旅
纯简单题
int main() {
int T;
cin >> T;
for (int i = 0; i < T; i++) {
int n, m;
cin >> n >> m;
long long res = 0;
for (int j = 0; j < n; j++) {
int l, r;
cin >> l >> r;
res += r - l + 1;
res %= 998244353;
}
cout << res << endl;
}
return 0;
}
3. 消息队列
王小二正在参与一款游戏中的聊天工具的开发,他负责其中的会话列表部分。 会话列表显示为一个从上到下的多行控件,其中每一行表示一个会话,每一个会话都可以以一个唯一正数id表示。
当用户在一个会话中发送或者接收信息时,如果该会话已经在会话列表中,则会从原来的位置移到列表最上方;如果没有在会话列表中,则在会话列表最上方插入该会话。
王小二现在要进行测试,他会先把会话列表清空,等待接收信息。当接收完大量来自不同会话的信息后,就输出当前的会话列表,以检查其中是否有bug。
简化的LRU,用栈反向输出即可
int main(int argc, char *argv[]) {
int t;
cin>>t;
while(t--){
int n;
cin>>n;
//按栈存数即可,已经出过的跳过
stack<int> st;
unordered_set<int> s;
int num;
for(int i=0;i<n;i++){
cin>>num;
st.push(num);
}
while(!st.empty()){
if(st.size()!=n) cout<<" ";//输出空格
int cur = st.top(); st.pop();
if(s.find(cur)==s.end()) cout<<cur;//没有输出过
s.insert(cur);//标识该id已经出过
}
if(t>0) cout<<endl;
}
return 0;
}
4. 交点数
假设平面上有n条直线,且不存在三条或以上直线共点的情况,
求这n条直线可能存在多少种不同交点数。例n=2,则可能的交点数量为0(平行)或者1(不平行)
动态规划,dp[i][j]表示i条线形成j个点的可行性,然后枚举i条线里面的平行线和非平行线进行转移
int main() {
string line;
while(getline(cin,line)){
int n = stoi(line);
//dp[i][j]表示i条线形成j个交叉点的可行性
vector<vector<bool>> dp(n + 1, vector<bool>(n * (n - 1) / 2 + 1, 0));
for(int i=0;i<=n;i++)
dp[i][0] = 1;//所有点都可以形成零个交叉点
for(int i=2;i<=n;i++){//遍历所有数量的线
for(int j=0;j<i;j++){//平行的线,可以给另外的线,加上对应数量的交叉点
for(int k=0;k<=i*(i-1)/2;k++){//所有状态向后转移
dp[i][(i-j)*j+k] = dp[i][(i-j)*j+k]|dp[i-j][k];//不平行的线形成k个交叉点,加上平行线,就可以新增对应交叉点
}
}
}
vector<int> res;
for(int i=0;i<=n*(n-1)/2;i++)
if(dp[n][i]) res.push_back(i);
for(int i=0;i<res.size();i++){
if(i!=0) cout<<" ";
cout<<res[i];
}
cout<<endl;
}
return 0;
}
5. 敏感词过滤
敏感词过滤一直是游戏里面最恼人的事情。恶意玩家总是想办法通过一定的修改来达到既能让系统检测不到,又让其他人看出来他发的内容。
现在,假设这些恶意玩家有这样两种操作:把字符串a的某些大写字符变成小写字符把字符串a的某些大写字符删掉
现给出两个字符串,判断能否通过以上两种操作从A字符串变成B字符串。
类似编辑距离
int dis(string&a,string&b){
int m = a.size(); int n = b.size();
//dp[i][j]表示将a中前i个字符变成b中前j个字符的最小操作次数
//dp[i][j] = dp[i-1][j-1]+1 如果a[i] 为b[j]的大写
//dp[i][j] = dp[i-1][j-1] 如果a[i]与b[j]相同
//dp[i][j] = dp[i-1][j]+1 如果a[i]为大写
vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX/2));
dp[0][0] = 0;
for(int i=1;i<=m;i++){
if(a[i-1]>='A'&&a[i-1]<='Z') dp[i][0] = min(dp[i][0],dp[i-1][0]+1);
for(int j=1;j<=n;j++){
if(a[i-1]>='A'&&a[i-1]<='Z'){//a为大写
dp[i][j] = min(dp[i][j],dp[i-1][j]+1);
if(a[i-1]-b[j-1]=='A'-'a') dp[i][j] = min(dp[i][j],dp[i-1][j-1]+1);
}
if(a[i-1]==b[j-1]) dp[i][j] = min(dp[i][j],dp[i-1][j-1]);
}
}
return dp[m][n];
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本