2018.9.30 Atcoder比赛

A - AtCoder Beginner Contest 999

  模拟水题string输入,逐位比较输出即可

#include<iostream>
#include<cstring>
using namespace std;
string s;
int main(){
    cin>>s;
    for(int i=0;i<s.size();++i)
        if(s[i]==49) cout<<9;
        else cout<<1;
    return 0;
}

 

B - AtCoder Beginner Contest 111

考虑这个数是否可以被111整除,可以直接输出这个数。

如果不可以的话,就输出不小于这个数的最小可以被111整除的数

#include<iostream>
#include<cstdio>
using namespace std;
int n;
int main(){
    scanf("%d",&n);
    if(n%111==0) printf("%d",n);
    else printf("%d",(n/111+1)*111);
    return 0;
}

 

C - /\/\/\/

 贪心做法,对于奇数项和偶数项分别统计出出现数量最多的和出现数量次多的数字,分两组情况讨论

1.奇数项和偶数项上出现次数最多的数字不一样 输出总长度分别减去这两个数在奇数位置和偶数位置出现次数;

2.奇数项和偶数项上出现次数最多的数字一样 比较奇数项上出现最多的数字出现次数和偶数项上出现次数次多的数字出现次数 与  偶数项上出现最多的数字出现次数和奇数项上出现次数次多的数字出现次数

用n减去他们之间的较大者就是答案。

#include<iostream>
#include<cstring> 
#include<cstdio>
using namespace std;
const int Maxn=100010;
int n,vis[Maxn][3],num[Maxn];
int g1,g2,g3,g4;
int maxn1=0,second1=0;
int maxn2=0,second2=0;
int main(){
    scanf("%d",&n);
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;++i){
        scanf("%d",&num[i]);
        if(i%2==0) vis[num[i]][2]++;
        else vis[num[i]][1]++;
    }
    for(int i=1;i<=n;i+=2){
        if(maxn1<vis[num[i]][1]){
            second1=maxn1;
            maxn1=vis[num[i]][1];
            g2=g1; g1=i;
        }
        else 
          if(second1<vis[num[i]][1]&&num[i]!=num[g1]){
              second1=vis[num[i]][1];
              g2=i;
          }
    }
    for(int i=2;i<=n;i+=2){
        if(maxn2<vis[num[i]][2]){
            second2=maxn2;
            maxn2=vis[num[i]][2];
            g4=g3; g3=i;
        }
        else 
          if(second2<vis[num[i]][2]&&num[i]!=num[g3]){
               second2=vis[num[i]][2];
               g4=i;
          }
    }
    if(num[g1]!=num[g3]) printf("%d",n-vis[num[g1]][1]-vis[num[g3]][2]);
    else printf("%d",n-max(maxn1+second2,maxn2+second1));
    return 0;
}

 

D - Robots Arms

 

posted @ 2018-09-30 12:53  Hadesa  阅读(88)  评论(0)    收藏  举报