Consecutive
#include<bits/stdc++.h>
using namespace std;
int n,q,g=0;
string s;
int a[300005];
int main(){
int l,r;
cin>>n>>q;
cin>>s;
for(int i=0;i<n-1;i++){
if(s[i]==s[i+1]){
a[i+1]=1;
}
a[i+1]+=a[i];
}
while(q--){
cin>>l>>r;
g=a[r-1]-a[l-1];
printf("%d\n",g);
}
return 0;
}
这道题当时的前缀和没用好一直错,主要是下标没弄清:还有另一种就是s字符串加个空格,下标从1开始就更简单一些。
To 3
#include <bits/stdc++.h>
using namespace std;
const int inf = 1e18;
int main() {
string s;
cin>>s;
int a=(int)s.size();
int x=inf;
for(int t=0;t<=(1<<a)-1;t++){
string b;
for(int i=0;i<a;i++)
if(t&(1<<i)) b+=s[i];
if(b.empty()) continue;
if(stoll(b)%3==0)
x=min(x,a-(int)b.size());
}
if(x==inf) cout<<-1;
else cout<<x;
return 0;
}
看到这道题的时候不太会用二进制枚举,然后去学习了一下,懂得了二进制枚举
Bowls and Dishes
#include <bits/stdc++.h>
using namespace std;
int a[106],b[106];
int c[106],d[106];
bool ball[106];
int main() {
int n, m;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>a[i]>>b[i];
}
int k;
cin>>k;
for(int i=0;i<k;i++){
cin>>c[i]>>d[i];
}
int sum=0;
for (int t=0; t<=(1<<k)-1; t++) {
memset(ball,false,sizeof(ball));
for (int i=0;i<k;i++){
if(t&(1<<i)) ball[c[i]]=true;
else ball[d[i]]=true;
}
int ans=0;
for (int i=0;i<m;i++)
if(ball[a[i]]&&ball[b[i]]) ans++;
sum=max(sum,ans);
}
cout<<sum;
return 0;
}
这道题也是二进制枚举,然后中间用memset重置ball数组
这篇还没完成,因为还有很多题看完题解有思路了,但是中间有些小知识点不太会,代码没有补全,我在认真学习后会把代码代码补全,把这个周报写完整写完整,还在学习中,知识点还差挺多。