http://codeforces.com/contest/872
A 给定俩数组,要求你输出一个数,这个数字至少包含每个数组中一个元素,并且要求最小
当两个元素有两个相同的,那么就输出就好了qwq
否则 输出俩数组中最小值组成的数。
#include <bits/stdc++.h>
using namespace std;
/* 直接写。
*/
int m,n;
int a;
int vis[11];
int main()
{ while(~scanf("%d%d",&m,&n)){
memset(vis,0,sizeof(vis));
int min1=10;
int min2=10;
for(int i=0;i<m;i++){
cin>>a;
if(vis[a]==0)
vis[a]=1;
min1=min(a,min1);
}
for(int i=0;i<n;i++){
cin>>a;
if(vis[a]==1)
vis[a]++;
min2=min(min2,a);
}
bool flag=false;
int kk=-1;
for(int i=1;i<=9&&!flag;i++)
if(vis[i]==2) kk=i,flag=true;
if(flag)
printf("%d\n",kk);
else
printf("%d%d\n",min(min1,min2),max(min1,min2));
}
return 0;
}
B
把m长的数组分成k份(每份要求连续),从每段中找到最小的, 然后再取最大的。
问你最大的结果是多少。
没有考虑一个细节,那就是元素的值可能是非常小的负数,-1还是不可以的。当可以分成三份时,可以直接把最大值切开得到。
当为2份时,如果最大值在两端点,那么也可以。
否则枚举尝试。。是没有啥规律的,尝试写规律wa了。
当为1份时,直接最小值。
看的别人的题解,,原来直接判断两端大小就行。看比较的代码也可以看出来,hiahia
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+2000;
int m,n;
ll a[maxn];
ll sum2[maxn];
ll sum1[maxn];
int main()
{ while(~scanf("%d%d",&m,&n)){
ll max1=-1e9-7;
ll min1=1e9+7;
for(int i=0;i<m;i++){
scanf("%lld",&a[i]);
min1=min(min1,a[i]);
max1=max(max1,a[i]);
if(i==0) sum1[0]=a[0];
else
sum1[i]=min(sum1[i-1],a[i]);
}
sum2[m-1]=a[m-1];
for(int i=m-2;i>=0;i--){
sum2[i]=min(sum2[i+1],a[i]);
}
if(n>=3)
{ printf("%lld\n",max1);
}
else if(n==2){
ll ans=-(1e9+7);
for(int i=0;i<=m-2;i++){
ans=max(max(sum1[i],sum2[i+1]),ans);
}
printf("%lld\n",ans);
}
else if(n==1){
printf("%lld\n",min1);
}
}
return 0;
}
C题。。没思路