ec round 92

B

根据贪心,答案必定取在在同一个位置左右横跳的情况。

这时候我们要注意z值与k值的大小关系,如果还在左右横跳的情况下,k值变为0,那么我们就要判断这时候跳到了左边还是右边;如果左右横跳z次数为0,k值不为0,那么我们只能再往右走。取其每种情况的最大值。

#include <bits/stdc++.h>
#define debug freopen("r.txt","r",stdin)
#define mp make_pair
#define ri register int
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 1e6+10;
const int INF = 0x3f3f3f3f; 
const int mod = 1e9+7;
inline ll read(){ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;}
ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;}
int t,n,k,z,i,w,a[maxn],ans,summ[maxn],sum[maxn],wei,m,ed,j;
int main()
{
    t=read();
    while (t--)
    {
        n=read(),k=read(),z=read();
        for (i=1;i<=n;i++) a[i]=read();
        for (i=1;i<=n;i++) 
        {
            summ[i]=summ[i-1]+a[i];
        }
        for (i=1;i<n;i++)sum[i]=a[i]+a[i+1];
        ans=summ[k+1];
        wei=k+1;
        for (i=1;i<=z;i++) 
        {    
            wei-=2;
            m=-1;
            if(wei<1) break;
            for (j=1;j<=wei;j++) m=max(m,sum[j]);
            ans=max(summ[wei]+m*i,ans);            
        }
        cout<<ans<<endl;
    }
    return 0;
 } 
View Code

 

C

根据数据可以分析得到,只能是两个值交替出现的时候才能符合题目条件,如 xyxyxyxyxy ,左移一位为 yxyxyxyxyx,右移一位为 yxyxyxyxyx,相等。要注意这种 xyxyxyxyx ,缺少出现一个 y 的情况,左移右移是不相等的。

如果在 x==y 的情况下,无论多少个,左移右移都能相等。

#include <bits/stdc++.h>
#define debug freopen("r.txt","r",stdin)
#define mp make_pair
#define ri register int
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 1e6+10;
const int INF = 0x3f3f3f3f; 
const int mod = 1e9+7;
inline ll read(){ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;}
ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;}
int i,len,j,l,t,maxx,sum;
char s[maxn];
int main()
{
    t=read();
    while (t--)
    {
        scanf("%s",s+1);
        len=strlen(s+1);
        maxx=0;
        for (i=0;i<=9;i++)
            for (j=0;j<=9;j++)
            {
                sum=0;
                for (l=1;l<=len;l++)
                    if ((s[l]-'0')==i && sum%2==0) sum++;
                        else if ((s[l]-'0')==j && sum%2==1) sum++;
                if (i==j) maxx=max(sum,maxx);
                    else if (sum%2==0) maxx=max(sum,maxx);
            }
        cout<<len-maxx<<endl;
    }
    return 0;
}
View Code

 

D

如果两个线段本身有交集,那么需要计算是否增长线段长度。如果要,那么我们一开始增长+1,交集+1,把所有组的线段都进行这样的处理,如果还没有符合题目条件,再决定是否要增长+2,交集+1

如果两个线段本身无交集,我们肯定要先让第一组线段有交集,一开始增长+1,交集+1,但是到了完全重合的时候,我们要增长+2,才能交集+1,只是这样做可能会取不到最优值。因此,我们可以试着选用下一组线段再次进行如此操作,先让线段有交集,再增长+1,交集+1,两者进行比较,取最优即可。

代码写太长没调出来……,这种模拟题一定要思路清晰。

 

posted @ 2020-09-07 22:41  Y-KnightQin  阅读(162)  评论(0)    收藏  举报