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