2022牛客寒假算法基础集训营4 补题题解(未完成)


过了四题,排名下降了不少,继续学

比赛传送门

官方题解


A R

原题传送门
请添加图片描述

#include <bits/stdc++.h>
 
using namespace std;

typedef long long ll;

#define db double
#define int  long long
#define ve vector<int>
#define vr vector<char>
#define pb push_back

typedef long long ll;

const int N = 2e5 + 10;

int n, k;
char s[N];
ll ans;

void gou(string s){
	
	int i = 0, j = 0;
	int temp = 0;
	//此时字符串t里面都是R,所以temp会一直增加,直到temp=k,
	//之后就会进入while循环,但每次while只会循环一次,因为进入temp就会改变,就不满徐继续循环的条件
	//满足temp==k之后就会从目前遍历的大区间(暂称为区间D)头部开始去除字符,得到区间a,去除一个即j++,就代表这一段区间可以产生的子串数量+1
	//之后继续向后遍历,即使没有新的R增加,但是新加入的字符和之前a区间的字符串也可以构成j数量的字符子串
	//因为之前j个字符串加上新加入的字符,还可以得到j个合法的字符子串
	//继续遍历找到R,等到达到temp=k,还可以尝试沿大区间去除a区间的头部字符,继续上述操作
	for(i = 0; i < s.size(); ++ i){
		temp += s[i] == 'R';//temp记录小区间a内有几个R 
		while(j <= i && temp == k){ 
			temp -= s[j ++ ] == 'R';
		}
		ans += j;
	}
}

signed main(){
    cin>>n>>k;
    cin>>s + 1;
    string t = "";
	for(int i = 1; i <= n; ++ i){
		if(s[i] == 'P'){
			gou(t);
			t = "";
		}
		else t += s[i];
	} 
	gou(t);
	cout<<ans<<endl;
    return 0;
}

K 小红的真真假假签到题题

这题挺亏的,思维还需要继续练,比赛的时候思维要足够发散才可以
请添加图片描述

请添加图片描述

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

#define int long long
#define pb push_back
#define rip(i, a, b) for(int i = a; i <= b; ++ i)
#define rop(i, a, b) for(int i = a; i < b; ++ i)

const int N = 1010, M = 1e9 + 10;

signed main()
{
	int n;
	cin>>n;
	int i;
	for(i = 1; i <= 32; ++ i){
		if(1 << i > n){
			break;
		}
	} 
	
	cout<<(1ll<<i) * n + n<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值