USACO Combination Lock(combo)問題解

2780 ワード

この暴力検索、O(N^3)、naive、兄はO(N^2)
もちろん大した差はありませんが、Nは5しかないので..
考え方:
総数、overlapを減算したものが結果です
コード:
/*
ID: bbsunch2
PROG: combo
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <vector>


using namespace std;

int main()
{
    ofstream fout ("combo.out");
    ifstream fin ("combo.in");
    int N;
    fin >> N;
    if (N == 1){
        fout << 1 << endl;
        return 0;
    }else if(N == 2){
        fout << 8 << endl;
        return 0;
    }else if(N == 3){
        fout << 27 << endl;
        return 0;
    }else if(N == 4){
        fout << 64 << endl;
        return 0;
    }else if(N == 5){
        fout << 125 << endl;
        return 0;
    }
    int total = 250;
    int num_list[6];
    fin >> num_list[0] >> num_list[1] >> num_list[2] >> num_list[3] >> num_list[4] >> num_list[5];
    vector<int> num_candidate[6];
    for(int i = 0; i < 6; i++){
        //cout << i << " =========" << endl;
        for(int j = 0; j < 5; j++){
            int a = num_list[i] - 2 + j;
            if (a <= 0){
                a = N + a;
            }else if (a == N){

            }else{
                a = a % N;
            }
            //cout << a << endl;
            bool exist = false;
            for(int k =0; k < num_candidate[i].size(); k++){
                if (a == num_candidate[i][k]){
                    exist = true;
                    break;
                }
            }
            if (!exist){
                num_candidate[i].push_back(a);
            }
        }
    }
    int overlap[3] = {0};
    for(int i = 0; i < 3; i++){
        int k = i + 3;
        //cout << num_candidate[i].size() << num_candidate[k].size() << endl;
        for (int m = 0; m < num_candidate[i].size(); m++){
            for(int n = 0; n < num_candidate[k].size(); n++){
                if(num_candidate[i][m] == num_candidate[k][n]){
                    overlap[i]++;
                    break;
                }
            }
        }
    }
    int subtract = overlap[0] * overlap[1] * overlap[2];
    fout << total - subtract << endl;

    return 0;
}