0
点赞
收藏
分享

微信扫一扫

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)

如有其他情况还请指正!

     

#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;
}
}

 



举报

相关推荐

0 条评论