某岛

… : "…アッカリ~ン . .. . " .. .
April 4, 2012

TCO 2012 Round 1A

250 EllysJuice:

Brief description:

有两杯果汁饮料,有 n 个人次,每人每次可以喝其中的一杯,每次喝一半。
现在只知道人次信息,不知道顺序,问有多少人有可能喝的是最多的。
(n <= 8)

Analysis:

注意到当第有人喝了 2 次时,可以安排其喝第一杯的第一口和第二杯的第一口。
之后其他人无论怎么喝也超不过这个值即可。

500 EllysFractions:

Brief description:

问分子和分母的积是一个阶乘数(不超过 N!)的假分数一共有多少。

Analysis:

注意到因子的独立性即可。

1000 EllysLights:

Brief description:

给定一个灯和一组开关,每个灯至多和两个开关联系。
给定初始灯的状态,问最少需要次开关操作可以熄灭所有灯。

Analysis:

亦或方程组,注意到问题的特殊性大概暴搜也是可以的。

/* -&$&#*( &#*@)^$@&*)*/

const int MOD = 1000000007;
const int INF = 0x7fffffff;

const int N = 50;


class EllysJuice {
public:
	vector <string> getWinners(vector <string> players) {

		map<string ,int> Hash; int up = 0;

		REP(i, SZ(players)) checkMax(up, ++Hash[players[i]]);

		vector <string> res;

		if (up >= 2){
		    for(map<string, int>::iterator it = Hash.begin(); it != Hash.end(); ++it)
		        if (it->second >= 2) res.PB(it->first);
		}
		else {
		    if (SZ(Hash) == 1) res.PB(players[0]);
		}

		return res;
	}
};
/* -&$&#*( &#*@)^$@&*)*/

const int MOD = 1000000007;
const int INF = 0x7fffffff;

const int N = 50;

bool isPrime(int n){
    FOR(i, 2, n) if (n % i == 0) return false;
    return true;
}


class EllysFractions {
public:
	long long getCount(int n) {
        LL res = 0; int cnt = -1;
        FOR(i, 2, n+1) cnt += isPrime(i), res += 1LL << cnt;
		return res;
	}
};
/* -&$&#*( &#*@)^$@&*)*/

const int MOD = 1000000007;
const int INF = 999;

const int N = 50;

vector<int> L[N]; LL op[N], state, forbid;
int n, m, res;

#define o1 L[x][0]
#define o2 L[x][1]

int dfs(int x = 0){

    if (x == n) return 0;

    int res = INF;

    if (SZ(L[x]) == 0){
        if (!_1(state, x)) res = dfs(x+1);
    }
    else if (SZ(L[x]) == 1){
        if (_1(state, x)){
            state ^= op[o1];
            res = dfs(x+1)+1;
            state ^= op[o1];
        }
        else {
            res = dfs(x+1);
        }
    }
    else if (SZ(L[x]) == 2){
        if (_1(state, x)){
            state ^= op[o1];
            res = dfs(x+1)+1;
            state ^= op[o1];
            state ^= op[o2];
            checkMin(res, dfs(x+1)+1);
            state ^= op[o2];
        }
        else {
            res = dfs(x+1);
            state ^= op[o1], state ^= op[o2];
            checkMin(res, dfs(x+1) + 2);
            state ^= op[o1], state ^= op[o2];
        }
    }

    return res;
}


class EllysLights {
public:
	int getMinimum(string initial, vector <string> switches) {

	    n = SZ(initial), m = SZ(switches);

	    REP(i, n) CLR(L[i]); RST(op), res = state = forbid = 0;

	    REP(i, m) FOR(j, i+1, m) if (switches[i] == switches[j]){
	        switches[j] = string('N', n);
	    }

	    REP(i, m) REP(j, n){
            if (switches[i][j] == 'Y'){
                L[j].PB(i), op[i] |= _1(j);
            }
	    }

        REP(i, n) if (initial[i] == 'Y') state |= _1(i);

        REP(x, n) if (_1(state, x)){
            if (L[x].empty()) return -1;
            if (SZ(L[x]) == 1) state ^= op[o1], forbid |= _1(o1), ++res;
        }
        else {
            if (SZ(L[x]) == 1) forbid |= _1(o1);
        }

        REP(i, n) CLR(L[i]);

	    REP(i, m) if (!_1(forbid, i)){
            REP(j, n){
                if (switches[i][j] == 'Y'){
                    L[j].PB(i); break;
                }
            }
	    }

        res += dfs(); if (res >= INF) res = -1;

		return res;
	}
};