【题解】240921ABC372

A:不是‘.’的记录

void solve() {
	string ss;
	string ans = "";
	cin >> ss;
	for(int i=0;i<ss.size();i++){
		if(ss[i]!='.'){
			ans += ss[i];
		}
	}
	cout << ans << endl;
}

A.模拟每次找最大

void solve() {
	int m;
	cin >> m;
	VI ans;
	while(m){
		if(pow(3,10)<=m){
			m-= pow(3,10);
			ans.push_back(10);
			continue;
		}
		if(pow(3,9)<=m){
			m-= pow(3,9);
			ans.push_back(9);
			continue;
		}
		else if(pow(3,8)<=m){
			m-= pow(3,8);
			ans.push_back(8);
			continue;
		}else if(pow(3,7)<=m){
			m-= pow(3,7);
			ans.push_back(7);
			continue;
		}else if(pow(3,6)<=m){
			m-= pow(3,6);
			ans.push_back(6);
			continue;
		}else if(pow(3,5)<=m){
			m-= pow(3,5);
			ans.push_back(5);
			continue;
		}else if(pow(3,4)<=m){
			m-= pow(3,4);
			ans.push_back(4);
			continue;
		}else if(pow(3,3)<=m){
			m-= pow(3,3);
			ans.push_back(3);
			continue;
		}else if(pow(3,2)<=m){
			m-= pow(3,2);
			ans.push_back(2);
			continue;
		}else if(pow(3,1)<=m){
			m-= pow(3,1);
			ans.push_back(1);
			continue;
		}
		else//if(pow(3,0)<=m){
		{	m-= pow(3,0);
			ans.push_back(0);
			continue;
		}
	}
	
	cout << ans.size() <<endl;
	
	for(auto i : ans){
		cout << i <<" ";
	}
	return;
}

C.每次从头遍历看定会超时,我们发现对于每次更新的x 令j = x-1,则只有

[j-2][j-1][j][j+1][j+2]会变化  看少了几个多了几个即可

void solve() {
	int n,q;
	cin >> n >> q;
	string s;
	cin >> s;
	int ans = 0;
	for(int i=0;i<s.size();i++){
		if(s.substr(i,3)=="ABC"){
			ans++;
		}
	}
	while(q--){
		int x;
		char c;
		cin >> x >> c;
		int j = x-1;
		//[j-2][j-1][j][j+1][j+2]
		if(s[j]== c){
			cout << ans <<endl;
			continue;
		}
		//不同,可能减少,可能增多
		//原有的
		int t1 = 0,t2=0;
		for(int k = j-2;k<=j;k++){
			if(k<0){
				continue;
			}
			if(s.substr(k,3)=="ABC"){
				t1++;
			}
		}
		s[j] = c;
		//新的
		for(int k = j-2;k<=j;k++){
			if(k<0){
				continue;
			}
			if(s.substr(k,3)=="ABC"){
				t2++;
			}
		}
		t2-=t1;
		ans += t2;
		cout << ans << endl;
	}
}

D.题意要求找到有多少对i,j使得i,j之间没有q[x] > q[j]

观察可得最后两个一定是 1 0,那么维护一段序列,如果递增那么i j 合法 ,对于非递增处x,踢出q[x],更新即可

void solve() {
	int n;
	cin >> n;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	if(n==2){
		cout <<"1 0"<<endl;
		return ;
	}
	if(n==1){
		cout <<"0"<<endl;
		return ;
	}
	ans[n] = 0;ans[n-1] = 1;
	deque<int> q;
	q.push_back(a[n]);
	if(a[n-1]>q.front())q.pop_back(),q.push_front(a[n-1]);
	else q.push_front(a[n-1]);
	for(int i = n-2;i>=1;i--){
		ans [i] = q.size();
		while(a[i]>q.front()&&!q.empty()){
			q.pop_front();
		}
		q.push_front(a[i]);
	}
	for(int i=1;i<=n;i++){
		cout <<ans[i]<<" ";
	}
	cout <<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值