A. Primary Task
思路:
就是10的几次方,看前两位是10,然后判断次数是否合法就行了
#include<bits/stdc++.h>
using namespace std;
#define fir first
#define sec second
#define endl "\n"
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
const int N = 1e5 + 10, M = N * 2, mod = 1e9 + 7, inf = 0x3f3f3f3f, P = 131;
void solve()
{
string s;
cin >> s;
if(s[0]=='1' && s[1]=='0'){
int cnt=0;
if(s[2]!='0'){
for(int i=2;i<s.size();i++){
cnt *= 10;
cnt += s[i]-'0';
}
if(cnt>=2){
cout<<"YES"<<endl;
return;
}
}
}
cout<<"NO"<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
cin >> t;
while(t --)
solve();
return 0;
}
B. Seating in a Bus:
思路:
翻译的很抽象,简说一下,第一位乘客随便坐,后面的乘客所带的编号+1或者-1有人才可以坐,一次类推,开个set看长度就行了,长度一样证明都坐下了
#include<bits/stdc++.h>
using namespace std;
#define fir first
#define sec second
#define endl "\n"
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
const int N = 2e5 + 10, M = N * 2, mod = 1e9 + 7, inf = 0x3f3f3f3f, P = 131;
void solve()
{
int n;
cin >> n;
set<int>st;
int tp;
for(int i=1;i<=n;i++){
cin >> tp;
if(i==1) st.insert(tp);
else{
if(st.count(tp+1)||st.count(tp-1))//判断上下是否有人
st.insert(tp);
}
}
if(st.size()==n) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
cin >> t;
while(t --)
solve();
return 0;
}
C. Numeric String Template
思路:
对应的字母和数字相等即可,但是会有坑
#include<bits/stdc++.h>
using namespace std;
#define fir first
#define sec second
#define endl "\n"
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
const int N = 2e5 + 10, M = N * 2, mod = 1e9 + 7, inf = 0x3f3f3f3f, P = 131;
int a[N];
void solve()
{
int n;
cin >> n;
for(int i=0;i<n;i++)
cin >> a[i];
int m;
cin>>m;
while(m--){
string s;
cin >> s;
int f=1;
map<char,int> mp;
map<int,char> mpp;
if(s.size()>n || s.size()<n) cout<<"NO"<<endl;
else{
for (int i=0;i<n;i++) {
char ts=s[i];
int ta=a[i];
if (mp.find(ts)!=mp.end()) {//如果有这个字符对应的下标
if (mp[ts]!=ta) {//如果不等就打个0的标记
f=0;
break;
}
}
else{
int f1=0;
for (const auto& v:mp) {//这就是坑的所在地方
if (v.sec==ta) {
f1=1;
break;
}
}
if (f1){
f=0;
break;
}
mp[ts]=ta;
}
}
if(f) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
cin >> t;
while(t --)
solve();
return 0;
}
D. Right Left Wrong
思路:
求区间和,用前缀和,这个题实际是双指针来找区间,以最好一个样例为例子,LRLRR,令l=0,r=n-1,第一对LR为 l=0,r=n-1,求一次和,第二对LR为l=2,r=n-2,再求一次和就是15+7=22;
#include<bits/stdc++.h>
using namespace std;
#define fir first
#define sec second
#define endl "\n"
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
const int N = 2e5 + 10, M = N * 2, mod = 1e9 + 7, inf = 0x3f3f3f3f, P = 131;
ll a[N],sum[N];
void solve()
{
int n;
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
sum[i]=sum[i-1]+a[i];
}
string s;
cin >> s;
int l=0,r=n-1;
ll ans=0;
while (l<r) {
if (s[l]=='L' && s[r]=='R') {
ans+=sum[r+1]-sum[l];
l++;
r--;
}
else if (s[l]=='L') {
while (l<r &&s[r]!='R') {
r--;
}
if (l<r) {
ans+=sum[r+1]-sum[l];
l++;
r--;
}
}
//下面两种情况可参考样例三,实际上就是让它自己动
else if (s[r]=='R') {
while (l<r && s[l]!='L') {
l++;
}
if (l<r) {
ans+=sum[r+1]-sum[l];
l++;
r--;
}
} else {
l++;
r--;
}
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
cin >> t;
while(t --)
solve();
return 0;
}