A. Primary Task
题意:给定一个数n,重要n的形式应该是
$$
10^x ( x≥2 )
$$
漏掉了符合^,求n是否为重要整数。
分析:如果前面两个数是10,后面的数不等于1或0,且第三个数不等于0就是重要整数
代码:
#include<bits/stdc++.h> using namespace std; int main(){ int t; cin>>t; while(t--){ string s;cin>>s; int x=0,y=0; if(s.size()<=1){ cout<<"NO\n"; } else{ x=10*(s[0]-'0')+(s[1]-'0'); for(int i=2;i<s.size();i++){ y=y*10+(s[i]-'0'); } if(x==10&&y>=2&&s[2]!='0'){ cout<<"YES\n"; } else cout<<"NO\n"; } } return 0; }
B. Seating in a Bus
题意:给定一个数组,除了第一个,后面每个元素都存在加一或减一任意一个,也就是说这个元素的加一或减一只要在前面出现过即可。
分析:用map记录元素是否存在,如果该元素的加一或减一元素都不存在则输出no,否则yes
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; void sol(){ ll n;cin>>n; map<ll,ll>mp;ll a[n+10]; for(int i=1;i<=n;i++)cin>>a[i]; mp[a[1]]++; for(int i=2;i<=n;i++){ if(mp[a[i]-1]||mp[a[i]+1])mp[a[i]]++; else{ cout<<"NO"<<endl; return; } } cout<<"YES"<<endl; return; } int main(){ int t;cin>>t; while(t--)sol(); return 0; }
C. Numeric String Template
题意:给定数组a和字符串s,如果ai=aj,则si=sj,如果si=sj,则ai=aj,数组和字符串必须完全匹配
分析:用v记录a数组是否存在,将mpsi更新为ai
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; void sol(){ ll n;cin>>n; ll a[n+10]; for(int i=0;i<n;i++)cin>>a[i]; ll m;cin>>m; while(m--){ map<char,ll>mp; string s;cin>>s; ll len=s.size(); if(len!=n){ cout<<"NO"<<endl; } else{ int flag=0; map<ll,ll>v; for(int i=0;i<n;i++){ if(!mp[s[i]]&&!v[a[i]]){ mp[s[i]]=a[i]; v[a[i]]=1; } else if(!mp[s[i]]&&v[a[i]]){ flag=1;break; } else{ if(mp[s[i]]!=a[i]){ flag=1; break; } } } if(flag==0)cout<<"YES"<<endl; else cout<<"NO"<<endl; } } } int main(){ int t;cin>>t; while(t--)sol(); return 0; }
D. Right Left Wrong
题意:每次可以选择任意一对LR,并加上区间LR内的所有数,被加过的数就不能做为下次的左区间或右区间
分析:用双指针,先将大区间里的数加起来,再往中间缩,用前缀和计算可方便
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; void sol(){ ll n;cin>>n; ll a[n+10],b[n+10]; for(int i=1;i<=n;i++)cin>>a[i]; string s;cin>>s; s="#"+s; b[0]=0; for(int i=1;i<=n;i++){ b[i]=b[i-1]+a[i]; } int j=n;ll sum=0; int flag=0,i=1; while(i<j){ if(s[i]=='L'){ while(s[j]=='L'){ if(i==j){ flag=1;break; } j--; } if(s[j]=='R'&&s[i]=='L')sum+=b[j]-b[i-1]; j--; if(i==j)break; } if(flag==1||i==j)break; i++; } cout<<sum<<endl; return; } int main(){ int t;cin>>t; while(t--)sol(); return 0; }