Codeforces Round #440(div2)

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题。。没思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值