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;}}