A. 模拟
#include <bits/stdc++.h>
using namespace std;
void solve(){
string s,ss;cin>>s>>ss;
if(s==ss)cout<<"="<<"\n";
else{
if(s[s.size()-1]=='S'){
if(ss[ss.size()-1]=='S'){
if(s.size()>ss.size())cout<<"<"<<'\n';
else cout<<">"<<'\n';
}
else cout<<"<"<<'\n';
}
else if(s[s.size()-1]=='M'){
if(ss[ss.size()-1]=='S')cout<<">"<<"\n";
else if(ss[ss.size()-1]=='M'){
if(s.size()>ss.size())cout<<">"<<'\n';
else cout<<"<"<<'\n';
}
else cout<<"<"<<'\n';
}
else if(s[s.size()-1]=='L'){
if(ss[ss.size()-1]=='L'){
if(s.size()>ss.size())cout<<">"<<'\n';
else cout<<"<"<<'\n';
}
else cout<<">"<<'\n';
}
}
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
B. 右移两位即可 把n==2 和n==3 特判即可
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;cin>>n;
if(n==3)cout<<-1<<'\n';
else if(n==2)cout<<2<<" "<<1<<'\n';
else {
if(n&1){
for(int i=n;i>3;i-=2){
cout<<i-1<<" "<<i<<" ";
}
cout<<1<<" "<<2<<" "<<3<<'\n';
}
else {
cout<<n-1<<" "<<n<<" ";
for(int i=1;i<=n-2;i++){
cout<<i<<" ";
}
cout<<'\n';
}
}
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
C. 先求出数组和sum 再遍历sum的每个因数 最后取最小即可
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;cin>>n;
int a[n];int sum=0,ans=1e9;
for(int i=1;i<=n;i++){
cin>>a[i];sum+=a[i];
}
for(int i=1;i<=n;i++){
if(sum%i==0){int cnt=0,b=0,maxx=0;
for(int j=1;j<=n;j++){
cnt++;
b+=a[j];
if(b==sum/i){
b=0;
maxx=max(cnt,maxx);
cnt=0;
}
if(b>sum/i){
maxx=0;break;
}
}if(maxx){
ans=min(ans,maxx);
}
}
}cout<<ans<<endl;
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
D. 递归的思想 如果想要满足条件必须左子树的最小要大于右子树最大值 或者右子树的最小值大于左子树的最大值 进行分治递归
#include <bits/stdc++.h>
using namespace std;
const int N=3e5;
int ans,INF=1e9;
int a[N];
void dfs(int l,int r){
if(l==r)return ;
int mid=(l+r)>>1;
if(a[l]>a[r])ans++;
int minn1=INF,maxx1=0,minn2=INF,maxx2=0;
for(int i=l;i<=mid;i++)
minn1=min(minn1,a[i]),maxx1=max(maxx1,a[i]);
for(int i=mid+1;i<=r;i++)
minn2=min(minn2,a[i]),maxx2=max(maxx2,a[i]);
if(a[l]>a[r]){
if(minn1<maxx2)ans=INF;
}
else {
if(minn2<maxx1)ans=INF;
}
dfs(l,mid),dfs(mid+1,r);
}
void solve(){
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
if(n==1){
cout<<0<<endl;
return ;
}
ans=0;
dfs(1,n);
if(ans>=INF)ans=-1;
cout<<ans<<endl;
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
E. 简单dp
#include <bits/stdc++.h>
using namespace std;
const int INF=1e9;
void solve(){
int n;cin>>n;int f[200005],a[n];
for(int i=1;i<=n;i++){
cin>>a[i];
f[i]=0;
}
f[0]=1;
for(int i=1;i<=n;i++){
if(i+a[i]<=n&&f[i-1]==1)f[i+a[i]]=1;
if(i-a[i]-1>=0&&f[i-a[i]-1]==1)f[i]=1;
}
if(f[n])cout<<"YES\n";
else cout<<"NO\n";
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}