title: 牛客小白月赛90
date: 2024-04-05 21:37:01
tags: 赛后思考与总结
categories: 比赛
A
思路
按题意直接累加就行
代码
int n; cin >> n;
int m; cin >> m;
ll ans = 0;
vector<int> a(n + 1);
for(int i =1; i <= n ; i ++) cin >> a[i];
for(int i = 1; i <= m; i ++){
int x; cin >> x;
ans += a[x];
}
cout << ans << endl;
B
思路
对双方取余3,如果取余后不相等,则不合法。
代码
int a,b;
cin >> a >> b;
if(a < b) swap(a,b);
a %= 3,b %= 3;
if(a == b) cout << "Yes" << endl;
else cout << "No" << endl;
C
思路
特判长度为1的数。当个长度大于等于2时,寻找最靠左的非前导0,该位为1,其后面的位置,填1或者0即是最优解,当没有出现0的时候,答案要么是1要么是2。
代码
void solve()
{
string s; cin >> s;
if(s.size() == 1) cout << 1 << endl;
else{
int ans = 1;
int x = s.size() ;
for(int i = 0; i < s.size() ; i ++){
if(s[i] == '0') {
x = i;
break;
}
}
//cout << x << endl;
for(int i = x + 1; i < s.size(); i ++){
if(s[i] == '0') ans = ans * 10 + 1;
else ans *= 10;
}
if(x == s.size()){
if(s[x - 1] == '1') ans = 2;
}
cout << ans <<endl;
}
}
D
思路
因为 m 小于 10,那么情况最多为 2 10 − 1 2 ^ {10} - 1 210−1次,因此二进制枚举每一种情况,当前选还是不选
代码
PII a[N];
void solve()
{
int n,m;
cin >> n >> m;
int ans = 0;
vector<int> st(n + 4);
for(int i = 0; i < m ; i++){
cin >> a[i].x >> a[i].y;
}
for(int i = 0; i < (1 << m); i ++){
for(int j = 0 ; j < m ; j++){
if((1 << j) & i){
st[a[j].x] ++;
st[a[j].y + 1] --;
}
}
int flag = 1;
for(int i = 1; i <= n; i ++){
st[i] += st[i - 1];
if(st[i] < 2) flag = 0;
st[i - 1] = 0;
}
if(flag) ans ++;
st[n] = 0;
}
cout << ans << endl;
}
E
思路
优先队列维护 k 个最小的值。
代码
int a[N],b[N];
void solve()
{
int n,m;
cin >> n >> m;
for(int i = 1; i <= n ; i ++) cin >> a[i];
for(int i = 1; i <= n ; i ++) cin >> b[i];
while(m --){
int k ; cin >> k;
priority_queue<int> q;
ll now = 0;
for(int i = 1; i <= k ; i++){
q.push(b[i]);
now += a[i];
now += b[i];
}
ll res = now;
//cout << res <<endl;
for(int i = k + 1; i <= n ; i ++){
now += a[i];
if(b[i] < q.top()){
now -= q.top();
q.pop();
q.push(b[i]);
now += b[i];
}
res = min(res,now);
}
cout << res << endl;
}
}