【题解】算法典当铺章节4

2535:substr后判断是否相同即可

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	int cnt = 0;
	int n;
	string ss;
	cin >> n >> ss;
	for(int i=0;i<n;i++){
		if(ss.substr(i,11)=="\\\\(@^_^@)//"){
			cnt ++;
			i+=10;
		}
	}
	cout << cnt<< endl;
	return 0;
}

2536:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

const int N = 100007;
int a[N],b[N],p[N];

bool cmp(pair<int,int>a,pair<int,int>b){
	return a.first>b.first;
}

int main(){
	int n;
	cin >> n;
	for(int i=0;i<n;i++){
		cin >> a[i];
	}
	for(int i=0;i<n;i++){
		cin >> b[i];
	}
	vector<pair<int,int>> x;
	for(int i=0;i<n;i++){
		int tt = a[i]-b[i];
		x.push_back({tt,i});
	}
	sort(x.begin(),x.end(),cmp);
	p[n-1]=x[n-1].first;
	for(int i=n-1;i>=0;i--){
		p[i]=max(p[i+1],x[i].first);
	}
	int ans = -0x3f3f3f3f;
	
	for(int i =0;i<n;i++){
		int now = x[i].first;
		ans = max(ans,now+p[i+1]);
	}
	cout << ans << endl;
}

2537:对于每个i判断二进制下的位数,然后判断1的个数,剩下的就是0的个数,n+1就是n<<1

#include<iostream>
using namespace std;
using ll = long long;

ll bitlen(ll n){
	ll len=0;
	while(n){
		n>>=1;
		len++;
	}
	return len;
}
ll bit1 (ll n)
{
	ll count=0 ;
	while (n) {
		count++ ;
		n &= (n - 1) ;
	}
	return count ;
}
//bitlen all
//bit1 1
//bitlen -bit1 0


int main(){
	ll n;
	cin >> n;
	int cnt = 0;
	while(bitlen(n)-bit1(n)<=bit1(n)){
		n++;
		cnt++;
	}
	cout << cnt << endl;
	return 0;
}

2538 sort后遍历

#include<iostream>
#include<algorithm>
using namespace std;

const int N = 1000010;
int q[N];

int main(){
	int n,s;
	cin >> n >> s;
	for(int i=0;i<n;i++){
		cin >>q[i];
	}
	int cnt = 0;
	sort(q,q+n);
	for(int i =0;i<n;i++){
		if(s>=q[i]){
			cnt ++;
			s-=q[i];
		}
		else{
			cout << cnt;
			return 0;
		}
	}
	cout <<cnt;
	return 0;
}

2539:每两个相邻的判断一下是否小于t即可

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 200010;
int a[N];
int main() {
	int n, k, t, ans = 0, now;
	cin >> n >> k >> t;
	for (int i = 0; i < k; i++) {
		cin >> a[i];
	}
	now = a[0];
	for (int i = 1; i < k; i++) {
		if (a[i] - now < t) ++ans;
		else now = a[i];
	}
	cout << ans << endl;
	return 0;
}

2540:首先考虑在没有陷阱的情况下,f[i]=f[i-1]+f[i-2],那么这就是一个很明显的斐波那契

其次在考虑有陷阱的情况:对于i-1,i,i+1中i为陷阱的时候,i+2和i+1都只有一种情况,f[i+1]=f[i-1],f[i+2]=f[i+1],此外如果有两个陷阱i,i+1相邻,那么就无解输出0即可

#include<iostream>
using namespace std;
int main(){
	int n,m;
	cin >> n >> m;
	int b[n], xianjing[m];
	for(int i=0;i<=n;i++){
		b[i]=1;
	}
	int flag=0;
	for(int i=1;i<=m;i++){
		cin >> xianjing[i];
		b[xianjing[i]] = 0;
		if(i>1)
			if(xianjing[i]-xianjing[i-1]==1 || xianjing[i]-xianjing[i-1]==-1)
				flag=1;
	}
	if(flag==1)
		puts("0");
	else{
		for(int i=3;i<=n;i++){
			if(b[i]==0)
				continue;
			else
				b[i]=b[i-1]+b[i-2];
		}
		cout << b[n]<<endl;
	}
	return 0;
}

2541:汉诺塔的递归很简单,这里需要注意的地方是怎么记录当前的状态,开三个vector来记录,对于每次的ABC进行讨论即可

#include <iostream>
#include <vector>
#include <algorithm>

void move(int n, char source, char target, char auxiliary, std::vector<std::pair<char, char>>& moves) {
	if (n == 0) return;
	

	move(n - 1, source, auxiliary, target, moves);
	moves.emplace_back(source, target);
	move(n - 1, auxiliary, target, source, moves);
}

void hanoi(int n, int m) {
	std::vector<std::pair<char, char>> moves;
	move(n, 'A', 'C', 'B', moves);

	std::vector<int> A(n);
	std::vector<int> B;
	std::vector<int> C;
	for (int i = 0; i < n; ++i) {
		A[i] = n - i;  
	}		
	for (int i = 0; i < std::min(m, static_cast<int>(moves.size())); ++i) {
		char source = moves[i].first;
		char target = moves[i].second;
		int disk;	
		if (source == 'A') {
			disk = A.back();
			A.pop_back();
		} else if (source == 'B') {
			disk = B.back();
			B.pop_back();
		} else {
			disk = C.back();
			C.pop_back();
		}	
		if (target == 'A') {
			A.push_back(disk);
		} else if (target == 'B') {
			B.push_back(disk);
		} else {
			C.push_back(disk);
		}
	}
	auto formatOutput = [](const std::vector<int>& tower) {
		std::cout << tower.size();
		for(int i = 0;i<tower.size();i++){
			std::cout <<" "<< tower[i];
		}
		std::cout << std::endl;
	};
	formatOutput(A);
	formatOutput(B);
	formatOutput(C);
}
int main() {
	int n, m;
	std::cin >> n >> m;  
	hanoi(n, m);
	return 0;
}

2542:数学

#include<iostream>
using namespace std;
int main(){
	int n;
	cin >> n;
	if(n<=1){
		cout <<"-1"<<endl;
	}
	else{
		cout << n <<" "<< n+1<<" "<<n*n+n<<endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值