Codeforces Contest 870 前三题KEY

A. Search for Pretty Integers:

题目传送门

题目大意:给定N和M个数,从前一个数列和后一个数列中各取一个数,求最小值,相同算一位数。

一道水题,读入A、B数组后枚举i、j判断最小值即可,注意相同时只需要一位。

 

B. Maximum of Maximums of Minimums:

题目传送门

题目大意:给定N和K,表示一个有N个数的数列和可以分成K段,使每一段中的最小值最大。

分类讨论,有三种情况:

  ·K=1,取最小值。

  ·K=2,分成两段取两段最小值的最大值。

  ·K>=3,输出最大值。

相信很多人对K>=3这一定不是很懂,因为K>=3,所以可以把原数列的最大值单独拆一个,所以一定是最优解。

 

C. Maximum splitting:

题目传送门

题目大意:给定Q个数,求每个数最多能由几个合数组成。

如果数学好的同学应该知道,肯定是由4、6、9构成最多。

对于每个数Qi,有以下几种情况:

  ·Qi%4==0,输出Qi/4;

  ·Qi%4==1,我们需要拿2个4和这个1组成9,所以如果Qi/4>=2输出Qi/4-1,不然输出-1;

  ·Qi%4==2,我们需要拿1个4和这个2组成6,所以如果Qi/4>=1输出Qi/4,不然输出-1;

  ·Qi%4==3,因为3=1+2,所以我们需要拿3个4和这个3组成6和9,所以如果Qi/4>=3输出Qi/4-2,不然输出-1;

 

Code:

#include <cstdio>
#include <algorithm>
using namespace std;
int N,M,a[10],b[10];
int main(){
    scanf("%d%d",&N,&M);
        for(int i=1;i<=N;i++)scanf("%d",&a[i]);
        for(int i=1;i<=M;i++)scanf("%d",&b[i]);
    int ans=2e9;
        for(int i=1;i<=N;i++)
            for(int j=1;j<=M;j++){
                if(a[i]==b[j])ans=min(ans,a[i]);
                else ans=min(ans,min(a[i]*10+b[j],b[j]*10+a[i]));
            }
    printf("%d",ans);
    return 0;
}
Problem A

 

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int N,K,a[100005],min1[100005],min2[100005],wcc=2e9,wccc=-2e9;
int main(){
    scanf("%d%d",&N,&K);
        for(int i=1;i<=N;i++)scanf("%d",&a[i]),wcc=min(wcc,a[i]),wccc=max(wccc,a[i]);
    if(K==1){printf("%d",wcc);return 0;}
    if(K==2){
        memset(min1,63,sizeof(min1));
        memset(min2,63,sizeof(min2));
        for(int i=1;i<=N;i++)min1[i]=min(min1[i-1],a[i]);
        for(int i=N;i>=1;i--)min2[i]=min(min2[i+1],a[i]);
        int ans=-2e9;
            for(int i=1;i<=N;i++)ans=max(ans,max(min1[i],min2[i]));
        printf("%d",ans);
        return 0;
    }
    printf("%d",wccc);
    return 0;
}
Problem B

 

#include <cstdio>
using namespace std;
int Query,x;
int main(){
    scanf("%d",&Query);
        for(;Query;--Query){int o=0;
            scanf("%d",&x);
            if(x%4==1){o=1;if(x/4<2){printf("-1\n");continue;}}
            if(x%4==2&&x/4<1){printf("-1\n");continue;}
            if(x%4==3){o=1;if(x/4<3){printf("-1\n");continue;}}
            printf("%d\n",x/4-o);
        }
    return 0;
}
Problem C

 

posted @ 2017-10-16 15:44  Cptraser  阅读(193)  评论(0编辑  收藏  举报