A. Rook
打印出象棋车的下一步
using namespace std;
void solve(){
string s;
cin>>s;
char a=s[0];
char b=s[1];
set<string>ans;
for(char i='1';i<='8';i++){
string t="";
t+=a;
t+=i;
ans.insert(t);
}
for(char i='a';i<='h';i++){
string t="";
t=t+i;
t=t+b;
ans.insert(t);
}
for(auto c:ans){
cout<<c<<"\n";
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
B. YetnotherrokenKeoard
题意:

思路:用栈来模拟
using namespace std;
void solve(){
string s;
cin>>s;
int n=s.size();
s=" "+s;
vector<int>da;
vector<int>xiao;
vector<int>vis(n+1);
for(int i=1;i<=n;i++){
if(s[i]=='B'&&da.size()){
vis[da.back()]=1;
da.pop_back();
}else if(s[i]=='b'&&xiao.size()){
vis[xiao.back()]=1;
xiao.pop_back();
}else if(s[i]>='a'&&s[i]<='z'){
xiao.push_back(i);
}else{
da.push_back(i);
}
}
for(int i=1;i<=n;i++){
if(!vis[i] && s[i] != 'B' && s[i] != 'b')cout << s[i];
}
cout<<"\n";
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
C. Removal of Unattractive Pairs
题意:给定一个字符串,可以将相邻两个不同的字符消掉,问最后最少有多少个字符

思路:先考虑将最多出现的字符消掉,如果其他所有的字符加起来都无法将最多的消掉,那么答案应该是

如果其他的字符不大于最多的那个字符
如果是偶数,就是0
如果是奇数,就是1
using namespace std;
void solve(){
int n;
string s;
cin>>n>>s;
map<int,int>mp;
for(int i=0;i<n;i++){
mp[s[i]]++;
}
int mx=0;
for(auto c:mp){
int x=c.second;
mx=max(mx,x);
}
if(mx<(n-mx)){
if(n&1){
cout<<1<<"\n";
}else{
cout<<0<<"\n";
}
}else{
cout<<n-2*(n-mx)<<"\n";
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
D. Jumping Through Segments
题意:给你n个区间,你从0出发,每次可以跳跃不大于k的距离,并且要在l[i]~r[i]中,问你最小的k是多少?
思路:个人感觉比简单,二分的裸题,如果人的跳跃的范围区间与l[i]~r[i]没有交集就返回false
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>>a;
bool check(int x){
int t1=0;
int t2=0;
for(auto c:a){
t1-=x;
t2+=x;
int x1=c.first;
int x2=c.second;
if(t1>x2||t2<x1)return false;
else{
t1=max(t1,x1);
t2=min(t2,x2);
}
}
return true;
}
void solve(){
a.clear();
int n;
cin>>n;
for(int i=1;i<=n;i++){
int l,r;
cin>>l>>r;
a.push_back({l,r});
}
int l=0,r=1e9+10;
while(l<r){
int mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
cout<<r<<"\n";
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
E. Good Triples
题意:给定一个n,找出满足下面关系的三元组


并且
思路:这个其中有无数的可能性,有点像dp的思想
先预处理一下 1~9的方案数
然后遍历n,将所有位数的方案乘起来
using namespace std;
int cnt[10];
void solve(){
string s;
cin>>s;
int n=s.size();
long long ans=1;
for(int i=0;i<n;i++){
ans*=(cnt[s[i]-'0']);
}
cout<<ans<<"\n";
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
for(int i=0;i<=9;i++){
for(int j=0;i+j<=9;j++){
for(int k=0;i+j+k<=9;k++){
cnt[i+j+k]++;
}
}
}
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}