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