Codeforces Round #616 (Div. 2)

本来打算写区间DP的,结果一想到昨天晚上的CF…还是先补一下题,安慰一下自己受伤的心灵…

A. Even But Not Even

感觉也就A题友善…
题意:一串数字,去掉几个数字,让这个串不能被2整除但是各个位的和可以被2整除。
思路也简单直接看代码吧…

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;

int main()
{
	int t,n;
	char s[N];
	cin>>t;
	while(t--)
	{
		cin>>n>>s+1;
		int sum[N];
		sum[0]=0;
		int j=-1;
		bool flag=0,flag1=0;
		for(int i=1;i<=n;i++)
		{
			sum[i]=sum[i-1]+s[i]-'0';

			if(j!=-1&&sum[i]&1&&(s[i]-'0')&1)
			{
				n=i;
				flag=flag1=1;
				break;
			}
			if(sum[i]%2==0&&(s[i]-'0')&1)
			{
				n=i;
				flag=1;
				break;
			}
			if(j==-1&&(s[i]-'0')&1)j=i;
		}
		if(flag)
		{
			if(flag1)
				for(int i=1;i<=n;i++)
					if(j==i) continue;
					else
						cout<<s[i];
			else
				for(int i=1;i<=n;i++)
						cout<<s[i];
			cout<<endl;
		}
		else cout<<-1<<endl;
	}

	return 0;
}

顺便写一个大佬的思路。(偶然看见的,真的是厉害,Orz)。
在这里插入图片描述

B. Array Sharpening

啊…这个题真的是不友善…
题意:给你n个数字,问这串数字在经过变换后(让某几个数字一直减,但是必须>0)是否遵循先增后减或者一直递增或者一直递减
思路:昨天真的是瞌睡的厉害了…一直一找那个最大值…今天脑子清醒才感觉,直接找最大上升序列和最大下降序列。具体的直接看代码吧,也是贼简单的一个水题…但是架不住自己菜啊,

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
int a[N];
int main()
{
    int t;  cin>>t;
    while(t--)
    {
        int n;  cin>>n;
        int flag1=0;
        int flag2=0;
        for(int i=0; i<n; i++)
            scanf("%d",&a[i]);
        for(int i=0; i<n; i++)
        {
            if(a[i]<i)
            {
                flag1=i-1;
                break;
            }
            if(i==n-1)
                flag1=i;

        }

        for(int j=n-1,k=0;j>=0;j--,k++)
        {
            if(a[j]<k)
            {
                flag2=j+1;
                break;
            }
        }
        if(flag1>=flag2)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}

C. Mind Control

题意:n个数字 你在第m个位置 每个人可以选头尾两个数字中的一个 选后删除 ,你可以指定前k 个人的选择, 问你一定能得到的数字的最大值.
思想:首先控制的k个人,一定是前k个人。我们枚举这k个人拿前面i个,那么后面就会有k-i个人,这个是由我控制的。然后还剩下m-k-1个人,我们枚举前面有j个人,那么后面就会有m-k-1-j个人,这个是由对方控制的。最后我从前面的一个物体,和后面的一个物体进行二选一,选择最大的,这个是由我控制的。由我控制的部分取max,由别人控制的部分取min,暴力枚举就可以。

#include<iostream>
using namespace std;
int t,n,m,k;
const int N = 5000;
int a[N];

int main()
{
	cin>>t;
	while(t--)
    {
		cin>>n>>m>>k;
		for(int i=0;i<n;i++) cin>>a[i];
		k=min(m-1,k);
		int ans=-1;
		for(int i=0;i<=k;i++)    //枚举可控的k次选择后所剩区间
        {
			int minn=0x3f3f3f3f;
			for(int j=0;j<m-k;j++)//再枚举不可控的m-k-1次选择后所剩的区间
			{
				int l=i+j,r=i+j+(n-m);
                cout<<l<<" "<<r<<endl;
				minn=min(minn,max(a[l],a[r]));//在最坏的情况中选择
			}
			ans=max(ans,minn);
			cout<<endl;
		}
		cout<<ans<<endl;
	}

	return 0;
}

发布了41 篇原创文章 · 获赞 5 · 访问量 2253

猜你喜欢

转载自blog.csdn.net/mumuhaoshuai/article/details/104154478