【牛客训练记录】牛客周赛 Round 82
训练情况
赛后反思
C题没想明白,但是发现了数列一定是不增加的,另外第一次出现的数字,那个位置就必须是那个数字,剩下可能是乘法原理之类的东西吧,但是没做出来
A题
判断字符串第一位和最后一位是否一致即可
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
string s; cin>>s;
int n = s.size();
if(s[0] == s[n-1]) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
B题
我们发现对于两个长度一样的队列,两个窗口会同时关掉,只需要判断数列中是否存在两个相同的元素即可
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int n; cin>>n;
map<int,int> v;
bool flag = true;
for(int i = 1;i<=n;i++){
int x; cin>>x;
v[x]++;
if(v[x] == 2) flag = false;
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
C题
判断是否存在的方法同上题,想要全部拍照显然需要从队列人少的开始,按照队列人数从小到大的顺序拍照,所以我们结构体记录位置和人数,排序后输出即可
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
struct node{
int x,y;
};
bool cmp(node x,node y){
return x.x > y.x;
}
void solve(){
int n; cin>>n;
vector<node> a(n + 1);
map<int,int> v;
bool flag = true;
for(int i = 1;i<=n;i++){
cin>>a[i].x;
v[a[i].x]++;
if(v[a[i].x] == 2) flag = false;
a[i].y = i;
}
if(flag){
cout<<"YES"<<endl;
sort(a.begin() + 1,a.end(),cmp);
for(int i = n;i;i--){
cout<<a[i].y<<" ";
}
} else cout<<"NO"<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
E题
首先我们考虑枚举 a,b 数列,位置 m 和 m + 1 的分界点,对于 a 数列求前缀 k 小数之和,对于 b 数列求后缀 k 小数之和,维护和我们考虑使用优先队列存当前最大的数,如果新的数小于最大的数,将最大的数替换成新数,使用堆维护这个操作,最后求出前后缀 k 小数和,遍历分界点答案取小值
点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,k; cin>>n>>k;
vector<int> a(n + 1),b(n + 1);
vector<int> pre(n + 1),suf(n + 1);
for(int i = 1;i<=n;i++) cin>>a[i];
for(int i = 1;i<=n;i++) cin>>b[i];
priority_queue<int> s;
int sum = 0;
for(int i = 1;i<=k;i++) s.push(a[i]),sum += a[i];
pre[k] = sum;
for(int i = k+1;i<=n;i++){
if(a[i] < s.top()){
sum -= s.top();
s.pop();
s.push(a[i]);
sum += a[i];
}
pre[i] = sum;
}
while(s.size()) s.pop();
sum = 0;
for(int i = n;i>=n-k+1;i--) s.push(b[i]),sum += b[i];
suf[n-k+1] = sum;
for(int i = n-k;i;i--){
if(b[i] < s.top()){
sum -= s.top();
s.pop();
s.push(b[i]);
sum += b[i];
}
suf[i] = sum;
}
int ans = LONG_LONG_MAX;
for(int i = k;i<=n-k;i++){
// cout<<i<<" "<<pre[i]<<" "<<suf[i]<<endl;
ans = min(ans,pre[i] + suf[i+1]);
}
cout<<ans<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具