Codeforces Round #616 (Div. 2)

Posted liyexin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #616 (Div. 2)相关的知识,希望对你有一定的参考价值。

地址:http://codeforces.com/contest/1291

  A题就不写解析了,就是给一个数,是不是本身满足这个条件或者删除某些数字来达到这个条件:奇数,各个位上的数字加起来是偶数。

  

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[3005];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n ;
        cin>>n;
        cin>>s;
        int len = strlen(s);
        int ji=0,ou=0;
        int sum = 0,ok=0;
        int mid;
        for(int i= 0 ;i <len;i++)
        {
            int k = s[i]-0;
            sum+=k;
            if(sum%2==0&&k%2!=0)
            {
                mid=i;ok=1;
            }
        }
        if(!ok)
            cout<<"-1"<<endl;
        else
            {
                //cout<<"::   ";
                for(int i=0;i<=mid;i++)
                    cout<<s[i];
                    cout<<endl;
            }
    }
}

  B题挺有意思:http://codeforces.com/contest/1291/problem/B

  题意:给出n个数字,满足以下任意一个条件即为锐化:单调递增/单调递减/先增后减(尖)。如果本身不符合,可以对任意一个数进行-1的操作任意次,前提是保证>=0。

  解析:由于我们可以对任意数字进行-1的操作任意次,所以我们可以把所给的数字进行更加直观化的变化:  比如  2   3   49   999  ----->>  0  1   2   3 。所以先记录单增结束的位置,这么判断呢,想象一下,从头往后放 0  1   2  3  2,如果出现了a[i]<i(比如i=4),说明什么?此时的i的前一位,a[i-1]=i-1,当前的a[i]<=i-1,那么它要么等于前一位,要么小于前一位,单增断掉了,所以就得到了单增结束的点。同理,记录从右往左的单增结束点,即正着看的单减的开始点(记得坐标转化为n-i-1)

     结束点一个为L,一个为R,如果L<R,肯定是实现不了锐化的。比如:  012323210,L=3,R=5,L<R,中间那个a[i]<i数字的存在是无论如何也锐化不了数组的。所以只要保证L>=R即可。根据我目前的发现,只要L==R,那么可以变成先增后减,而L>R对应的是单点递增或者单调递减,如有其他情况还请指正!

     

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn  = 3e5+10;
typedef long long ll;
ll a[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n ;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        int l=n,r=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]<i)
                break;
            l=i;
        }
        for(int i=n-1;i>=0;i--)
        {
            if(a[i]<(n-i-1))
                break;
            r=i;
        }
        if(l>=r)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
}

 

以上是关于Codeforces Round #616 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #616 题解

Codeforces Round #616 (Div. 2)

Codeforces Round #616 (Div. 2)

Codeforces Round #616 (Div. 1)

Codeforces Round #616 部分题解

Codeforces Round #616(Div.2) Even But Not Even