牛客小白月赛90


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 2101次,因此二进制枚举每一种情况,当前选还是不选

代码

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;
		
	}
	
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值