zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    【转】如何解决Verilog中参数化的赋值:赋全0,赋全1,赋全Z,赋全x
    【转】PCIe DMA
    【转】PCIe学习(二)——PCIe DMA关键模块分析之一
    PCIe配置空间
    [转]PCIe学习笔记之MSI/MSI-x中断及代码分析
    [转]常用通信接口保护电路
    [转]原理图和PCB元件对应查找--Altium Designer
    [原]PCB中MARK点制作
    [转]使用Altium Designer软件铺铜后再挖铜
    支持Json进行操作的Javascript类库TAFFY DB
  • 原文地址:https://www.cnblogs.com/liyexin/p/12260391.html
Copyright © 2011-2022 走看看