A-A+B Again?
思路:输入的是一个两个字符的字符串,拆成两个数再相加就好了
AC代码:
#include<bits/stdc++.h>
using namespace std;
void solve(){
string s;
cin>>s;
int a = s[0]-'0';
int b = s[1]-'0';
cout<<a+b<<endl;
}
int main(){
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
B - Card Game
思路:四个数 a,b,c,d 分成 ac和bd ad和bc两种情况 每种情况里面又分两种情况, 因为顺序不用管, 所以一种大情况成立 cnt+=2
AC代码:
#include<bits/stdc++.h>
using namespace std;
void solve(){
int a,b,c,d;
cin>>a>>b>>c>>d;
int cnt = 0;
if((a>c && b>=d) || (b>d && a>=c)) cnt+=2;
if((a>d && b>=c) || (b>c && a>=d)) cnt+=2;
cout<<cnt<<'\n';
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
C - Showering
思路:因为给出的时间段不会重叠,所以使用 vector<pair<int,int> >来存,之后在sort排序一下,特判首尾两端之后再遍历中间,看有没有足够洗澡的时间段即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,xi,m;
cin>>n>>xi>>m;
vector<pair<int,int> > mask(n);
int a,b;
for(int i=0;i<n;i++){
cin>>a>>b;
mask[i]={a,b};
}
sort(mask.begin(),mask.end());
if(mask[0].first-0>=xi){ cout<<"Yes\n"; return ;}
if(m-mask[n-1].second>=xi){cout<<"Yes\n"; return ;}
for(int i=1;i<n;i++){
if(mask[i].first-mask[i-1].second>=xi){cout<<"Yes\n"; return ;}
}
cout<<"No\n";
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
D - Slavic's Exam
思路:双指针,一个指着s,一个指着t,遇到‘?’就将t指着的字符赋给它,若之后还剩多的‘?‘ 就全部换成A即可,若t的指针最后指不到t的末尾,说明t不是从s中可以得到的字串,输出NO
AC代码:
#include<bits/stdc++.h>
using namespace std;
void solve(){
string s,t;
cin>>s;
cin>>t;
int tzhi = 0;
for(int i=0;i<s.size();i++){
if(s[i]==t[tzhi] || s[i]=='?'){
if(s[i]=='?') s[i]=t[tzhi];
tzhi++;
}
if(tzhi == t.size()){
for(int j=i;j<s.size();j++){
if(s[j]=='?') s[j]='a';
}
cout<<"YES\n";
cout<<s<<'\n';
return ;
}
}
cout<<"NO\n";
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
E - Triple Operations
思路:第一步就是要变换出第一个0,由于在此过程中会有另一个数不断x3,所以实际要消耗的次数要x2,数组中的其他数就可以先不用处理,接下来就是要看每个数要除几次3才能变为0 显然的,一个个数判断耗时太多了,会TLE 所以我们预处理出一个3的幂次表(从题目中给的范围来看,处理到3的12次方就足够了) 记录下第一个数在幂次表中的位置之后,开始遍历幂次表,与数列右端进行比较,然后直接将 下标*数量 加给cnt就好了,大大减少耗时,但要注意边界条件的判断
AC代码:
#include<bits/stdc++.h>
using namespace std;
vector<int> pow3 = {1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441};
int pan(int x){
int cc = lower_bound(pow3.begin(),pow3.end(),x)-pow3.begin();
if(pow3[cc]==x) cc++;
return cc;
}
void solve(){
int l,r;
cin>>l>>r;
int jilu = pan(l); //cout<<"jilu "<<jilu<<endl;
int cnt = jilu*2; //cout<<"pan l= "<<pan(l)<<endl;
for(int i=jilu;i<13;i++){
if(pow3[i]<=r){
cnt+= i*(pow3[i]-max(l,pow3[i-1]));
cnt+= 1;
}
else if(pow3[i]>r){
cnt += i*(r-max(l,pow3[i-1]));
break;
}
// else if(pow[i]<r){
// }
}
cout<<cnt<<endl;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}