Codeforces Contest 870 前三题KEY

2023-03-18,,

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[],b[];
int main(){
scanf("%d%d",&N,&M);
for(int i=;i<=N;i++)scanf("%d",&a[i]);
for(int i=;i<=M;i++)scanf("%d",&b[i]);
int ans=2e9;
for(int i=;i<=N;i++)
for(int j=;j<=M;j++){
if(a[i]==b[j])ans=min(ans,a[i]);
else ans=min(ans,min(a[i]*+b[j],b[j]*+a[i]));
}
printf("%d",ans);
return ;
}

Problem A

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

Problem B

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

Problem C

Codeforces Contest 870 前三题KEY的相关教程结束。

《Codeforces Contest 870 前三题KEY.doc》

下载本文的Word格式文档,以方便收藏与打印。