Codeforces Round #826 (Div. 3)题解A-E(补)

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();
	}
} 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值