Codeforces Round #616 (Div. 2) 题解
A. Even But Not Even
题意:
定义一个数所有位置的和为偶数它本身不为偶数的数为ebne,现在给你一个数字字符串,你可以删除任意位置上的数字使其变为ebne输出任意改变后的结果,如果不能则输出-1
思路:
比赛的时候分类讨论过的。。。真是愚蠢至极妈的
其实只要看字符串中奇数的个数就好了,如果小于两个则肯定不行,如果大于两个则直接按相对位置输出任意两个就好了
#include<iostream> #include<algorithm> #include<string> using namespace std; int main() { int t,n; scanf("%d",&t); while(t--){ string a,b; cin>>n>>a; for(int i=0;i<n;i++){ if((a[i]-'0')%2) b+=a[i]; } if(b.length()<2) cout<<"-1"<<endl; else cout<<b.substr(0,2)<<endl; } return 0; }
B. Array Sharpening
题意:
给你一个数组,你可以对任意位置上的元素进行任意次的减1操作(不能使元素小于0),使得该数组变成一个先严格递增再严格递减的数组(也可以只升不降,只降不升)
思路:
我们考虑将每个元素都作为转折点尝试,如果a[i]<min(i,n-i-1)的话该序列一定不行,最后还需特判一下n为偶数n/2-1与n/2是否相同
#include<iostream> #include<algorithm> using namespace std; const int maxn=3e5+10; int a[maxn]; int main() { int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); int flag=0; for(int i=0;i<n;i++){ scanf("%d",&a[i]); if(a[i]<min(i,n-1-i)) flag=1; } if(n%2==0) if(a[n/2-1]==n/2-1&&a[n/2]==a[n/2-1]) flag=1; if(flag) cout<<"No"<<endl; else cout<<"Yes"<<endl; } return 0; }
C. Mind Control
题意:
n个元素,n个人轮流取数,可以取数组头或尾元素,你在第m轮取,并且你可以控制k个人取什么元素,问你能取得最大元素是多少(前面的人不一定都取最大的)
思路:
枚举一下现在强制多少人站队听他的,遍历剩下不听他的人的人数,然后把从后往前和从前往后的最大值的最小值的最大值算出来就可以了
#include<iostream> #include<algorithm> #define inf 0x3f3f3f3f using namespace std; const int maxn=3510; int a[maxn],t,n,m,k; int main() { scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++) scanf("%d",&a[i]); k=min(m-1,k); int ans=-inf; for(int i=0;i<=k;i++){ int x=inf; for(int j=0;j<m-k;j++) x=min(x,max(a[i+j],a[n+i+j-m])); ans=max(ans,x); } cout<<ans<<endl; } return 0; }