A - Not Too Hard (atcoder.jp)
AC代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
const int N=10;
int s[N];
int n,x;
void solve() {cin>>n>>x;for(int i=1;i<=n;i++) cin>>s[i];int ans=0;for(int i=1;i<=n;i++){if(s[i]<=x) ans+=s[i];}cout<<ans<<endl;
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
// cin>>t;while(t--) {solve();}return 0;
}
B - 11/11 (atcoder.jp)
直接暴力循环
AC代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
const int N=110;
int d[N];
int n;
void solve() {cin>>n;for(int i=1;i<=n;i++) cin>>d[i];int ans=0;for(int i=1;i<=n;i++){for(int j=1;j<=d[i];j++){string s=to_string(i)+to_string(j);bool ok=true;for(int k=1;k<(int)s.size();k++){if(s[k]!=s[k-1]){ok=false;break;}}if(ok) ans++;}}cout<<ans<<endl;
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
// cin>>t;while(t--) {solve();}return 0;
}
C - Consecutive (atcoder.jp)
利用前缀和的思想,快速统计某区间满足题意的p的个数
AC代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
const int N=3e5+10;
int pre[N];
int n,q;
string s;
void solve() {cin>>n>>q;cin>>s;s=' '+s;pre[1]=1;for(int i=2;i<=n;i++){if(s[i]==s[i-1]) pre[i]=pre[i-1]+1;else pre[i]=pre[i-1];}for(int i=0;i<q;i++){int l,r;cin>>l>>r;cout<<pre[r]-pre[l]<<endl;}
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
// cin>>t;while(t--) {solve();}return 0;
}
D - Take ABC (atcoder.jp)
利用string的find函数和erase函数
超时代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
string s;
void solve() {cin>>s;auto pos=s.find("ABC");if(pos==s.npos){cout<<s<<endl;return;}while(pos!=s.npos){s.erase(s.begin()+pos,s.begin()+pos+3);pos=s.find("ABC");}cout<<s<<endl;
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
// cin>>t;while(t--) {solve();}return 0;
}
糊涂了,这题很明显用栈的
然后还是错,想的是判断栈顶是A,然后后面两个字符分别是B和C,但是如果栈里面存的是A和B,然后删了一个ABC之后,下一个刚好是B的话就错了
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
string s;
stack<char>q;
void solve() {cin>>s;int n=s.size();s+='X';for(int i=0;i<n;i++){if(q.size()&&q.top()=='A'&&s[i]=='B'&&s[i+1]=='C') q.pop(),i++;else q.push(s[i]);}string tmp="";while(q.size()){tmp=q.top()+tmp;q.pop();}cout<<tmp<<endl;
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
// cin>>t;while(t--) {solve();}return 0;
}
如果是存字符的话,可以用string代替栈,每插入一个字符,就判断最后三个字符是否是ABC,也可以用vector代替栈,好处是不仅可以知道栈顶,即最后一个元素,还可以知道倒数第二个,第三个...
AC代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
string s;
void solve() {cin>>s;string tmp="";for(int i=0;i<(int)s.size();i++){tmp.push_back(s[i]);if(tmp.size()>=3&&tmp[tmp.size()-3]=='A'&&tmp[tmp.size()-2]=='B'&&tmp[tmp.size()-1]=='C'){tmp.pop_back();tmp.pop_back();tmp.pop_back();}}cout<<tmp<<endl;
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
// cin>>t;while(t--) {solve();}return 0;
}