AtCoder Regular Contest #002

AtCoder Regular Contest #002

問題A:うるう年

うるう年かどうか判定する問題です。うるう年の規則については問題文に記述されているのでそれを見てプログラムを書くとよいでしょう。

#include <iostream>
using namespace std;

bool is_leap(int y){
    return ((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0));
}

int main(){
    int y;
    cin >> y;
    cout << (is_leap(y)? "YES" : "NO") << endl;
}

問題B:割り切れる日付

入力された日付y/m/d以降で y÷m÷dが割り切れるもっとも早い日付を求めます。一日ずつ進めていって調べるとよいでしょう。

#include <cstdio>
using namespace std;

//            1  2  3  4  5  6  7  8  9 10 11 12
int h[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

bool is_leap(int y){
    return ((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0));
}

struct Time{
    int y,m,d;
    Time(int y_, int m_, int d_){
        y = y_; m = m_; d = d_;
    }
    void inc(){
        if( is_leap( y ) && m == 2 && d == 28 ){
            d++;
        }else if(is_leap( y ) && m == 2 && d == 29 ){
            m++;
            d = 1;
        }else{
            if( d < h[m-1] ){
                d++;
            }else{
                d = 1;
                if( m == 12 ){
                    m = 1;
                    y++;
                }else{
                    m++;
                }
            }
        }
    }
};

bool check(Time t){
    if( t.y % (t.m * t.d) == 0 ) return true;
    return false;
}

int main(){
    int y, m ,d;
    scanf("%d/%d/%d", &y, &m, &d);
    Time t( y , m , d );
    while( !check(t) ){
        t.inc();
    }
    printf("%d/%02d/%02d\n", t.y , t.m , t.d );
}

問題C:コマンド入力

ボタンが'A', 'B', 'X', 'Y'の4種類があり, ボタンLとRに4種類のボタンのうち2つのボタンをショートカットとして割り当てることができます。
2つのボタンをショートカットとして割り当ては全部で16通りで、LとRの2つのボタンに割り当てるので16*16=256通り全部のショートカットの割り当てを試すとよいでしょう。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
string h[16] = {
    "AA","AB","AX","AY",
    "BA","BB","BX","BY",
    "XA","XB","XX","XY",
    "YA","YB","YX","YY"
};

int solve(string s){
    int ans = 1e+8;
    for(int i=0 ; i < 16 ; i++ ){
        for(int j=0 ; j < 16 ; j++ ){
            if( i == j ) continue;
            int sum=0;
            for(int k=0 ; k < s.size() ; ){
                if( k == s.size()-1 ){
                    sum++;
                    k++;
                }else if( s[k] == h[i][0] && s[k+1] == h[i][1] ){
                    sum++;
                    k += 2;
                }else if( s[k] == h[j][0] && s[k+1] == h[j][1] ){
                    sum++;
                    k += 2;
                }else{
                    sum++;
                    k++;
                }
            }
            ans = min( ans , sum );
        }
    }
    return ans;
}

int main(){
    int n;
    string s;
    cin >> n >> s;
    cout << solve( s ) << endl;
}