【牛客训练记录】中国地质大学(武汉)2024年新生赛(同步赛)
训练情况
赛后反思
B题大模拟急到红温了,WA了四发,未考虑到部分细节情况
A题
直接输出 \(x-1\) 即可。
#define int long long
using namespace std;
void solve(){
int x; cin>>x;
cout<<x-1;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
B题
我们使用队列容器来记录某一天的预约队列,按照题目要求在每一天开始的时候优先把预约的处理掉,然后再按照时间顺序处理每个用户的请求,书的部分我们容易发现它是个栈,我们使用 stack 维护即可,处理好题目中的细节情况即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e4 + 3;
int n,m;
vector<int> r[N];
map<int,bool> rvis;
map<int,int> book;
stack<int> s;
void solve(){
cin>>n>>m;
for(int i = 1;i<=n;i++) s.push(i);
int ll = 1,rr = 1;
while(m--){
int day,id; string opt;
cin>>day>>opt>>id;
rr = day;
for(int dd = ll;dd<=rr;dd++){
for(int i = 0;i<r[dd].size();i++){
rvis[r[dd][i]] = 0;
if(!s.size()) continue;
book[r[dd][i]] = s.top();
s.pop();
}
}
ll = day+1;
if(opt == "RESERVE"){
int d; cin>>d;
if(rvis[id]||book[id]){
cout<<0<<endl;
continue;
}
rvis[id] = 1;
r[day+d].push_back(id);
cout<<1<<endl;
} else if(opt == "BORROW"){
if(book[id]||s.size() == 0||rvis[id]){
cout<<0<<endl;
continue;
}
book[id] = s.top();
cout<<s.top()<<endl;
s.pop();
}
else if(opt == "RETURN"){
if(!book[id]){
cout<<0<<endl;
continue;
}
s.push(book[id]);
cout<<book[id]<<endl;
book[id] = 0;
}
else if(opt == "QUERY"){
cout<<book[id]<<endl;
}
}
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
C题
我们想要判断答案最后能否为 \(0\),我们易知重复的与操作答案会越来越小,所以我们只需要把数列中所有元素按位与即可,判断最后按位与的答案是否为 0 即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n; cin>>n;
vector<int> a(n + 1);
for(int i = 1;i<=n;i++) cin>>a[i];
int res = a[1];
for(int i = 2;i<=n;i++) res &= a[i];
if(res == 0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
E题
这题我们观察到数据范围较小,我们可以使用深度优先搜索(DFS)枚举出所有的技能释放方案,再直接模拟即可,最后答案取大值。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100;
int n,a;
int d[N],c[N],last[N];
int ans = 0;
void pd(){
// c[1] = 4,c[2] = 1,c[3] = 2,c[4] = 4,c[5] = 3;
int res = 0;
int nq = 0;
int flag = 0;
for(int i = 1;i<=n;i++){
if(c[i] == 1){
if(flag == i) res+=2*d[i];
else res+=d[i];
}
else if(c[i] == 2) nq+=a;
else if(c[i] == 3){
if(flag == i) res+=2*nq;
else res+=nq;
}
else if(c[i] == 4) flag = i+1;
// cout<<res<<endl;
}
ans = max(ans,res);
}
void dfs(int x){
if(x > n){
// for(int i = 1;i<=n;i++) cout<<c[i]<<" ";
// cout<<endl;
pd();
return;
}
for(int i = 1;i<=4;i++){
if(x-last[i]<=2) continue;
c[x] = i;
int tmp = last[i];
last[i] = x;
dfs(x + 1);
c[x] = 0;
last[i] = tmp;
}
}
void solve(){
cin>>n>>a;
for(int i = 1;i<=n;i++) cin>>d[i];
for(int i = 1;i<=4;i++) last[i] = -10;
// pd();
dfs(1);
cout<<ans<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
G题
我们观察题目可知,需要求区间 \([l,r]\) 偶数的个数,数据范围允许遍历,我们直接遍历判断即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int l,r; cin>>l>>r;
int ans = 0;
for(int i = l;i<=r;i++){
if(i%2==0) ans++;
}
cout<<ans<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
H题
首先题数相同,我们只需要记录字符串的长度的出现次数即可,设同一通过题数的队伍数为 \(n\),显然所有罚时的排列组合为 \(n!\),最后我们乘法原理即可算出最终答案。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9 + 7;
int cnt[507];
int jc(int x){
int ans = 1;
for(int i = 1;i<=x;i++) ans*=i,ans%=mod;
return ans%mod;
}
void solve(){
int n; cin>>n;
for(int i = 1;i<=n;i++){
string s; cin>>s;
cnt[s.size()]++;
}
int ans = 1;
for(int i = 1;i<=26;i++){
if(!cnt[i]||cnt[i]==1) continue;
ans *= jc(cnt[i]);
ans %= mod;
}
cout<<ans<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
L题
我们发现每次操作都会删掉前面两个元素,所以我们要最后留下的数最大,我们必须在删掉之前把它移到最后面去,长度为 \(n\) 需要删 \(\lfloor \frac{n}{2} \rfloor\) 次,每次相邻元素交换可以将某个元素往右移动一位,所以我们只需要求区间 \([\lfloor \frac{n}{2} \rfloor,n]\) 之间最大的元素即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n; cin>>n;
vector<int> a(n + 1);
for(int i =1 ;i<=n;i++) cin>>a[i];
int ma = 0;
int lim = n/2;
for(int i = n-lim;i<=n;i++) ma = max(ma,a[i]);
cout<<ma<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}