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; }
#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; }
#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; }