思维 2017.4.23

1、POJ 3279 Fliptile

参考:《挑战程序设计竞赛》P154

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <ctime>
#include <cassert>

using namespace std;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define eps 1e-9

typedef long long ll;
typedef pair<int, int> pii;

const int INF = 0x7fffffff;
const int maxn = 15;

int N, M, t, i_t, x, y, Min = INF, cnt = 0;
bool flag = true, have_sloution = false;
int G[maxn][maxn], G_t[maxn][maxn], ans_t[maxn][maxn], ans[maxn][maxn];
int dir[][2] = {{0, 0}, {1, 0}, {0, 1}, {0, -1}};

int main() {
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
#endif // __AiR_H
    scanf("%d %d", &M, &N);
    REP(i, M) REP(j, N) { scanf("%d", &G[i][j]); }
    t = 1 << N;
    REP(i, t) {
        memcpy(G_t, G, sizeof(G_t));
        memset(ans_t, 0, sizeof(ans_t));
        i_t = i; cnt = 0;
        flag = true;
        for (int j = N - 1; j >= 0; --j) {
            if (i_t & 1) {
                ans_t[0][j] = 1; ++cnt;
                if (cnt > Min) { flag = false; break; }
                REP(k, 4) {
                    x = dir[k][0]; y = j + dir[k][1];
                    if (0 <= x && x < M && 0 <= y && y < N) { G_t[x][y] = !G_t[x][y]; }
                }
            }
            i_t >>= 1;
        }
        if (!flag) { continue; }
        for (int a = 1; a < M; ++a) REP(b, N) {
            if (G_t[a - 1][b]) {
                ans_t[a][b] = 1; ++cnt;
                if (cnt > Min) { flag = false; break; }
                REP(c, 4) {
                    x = a + dir[c][0]; y = b + dir[c][1];
                    if (0 <= x && x < M && 0 <= y && y < N) { G_t[x][y] = !G_t[x][y]; }
                }
            }
        }
        if (!flag) { continue; }
        REP(j, N) { if (G_t[M - 1][j] == 1) { flag = false; break; } }
        if (flag) {
            have_sloution = true;
            if (cnt < Min) { Min = cnt; memcpy(ans, ans_t, sizeof(ans)); }
        }
    }
    if (!have_sloution) { printf("IMPOSSIBLE\n"); }
    else {
        for (int i = 0; i < M; ++i) {
            for (int j = 0; j < N - 1; ++j) {
                printf("%d ", ans[i][j]);
            }
            printf("%d\n", ans[i][N - 1]);
        }
    }
#ifdef __AiR_H
    printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);
#endif // __AiR_H
    return 0;
}


2、HDU 5301 Buildings

参考:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-2-%e9%a2%98%e8%a7%a3-by-%e5%ad%a6%e5%86%9b%e4%b8%ad%e5%ad%a6/

注意:当n=6,m=7,x=4,y=2时,(x, y)在图中C1所示的位置



#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <ctime>
#include <cassert>

using namespace std;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define eps 1e-9

typedef long long ll;
typedef pair<int, int> pii;

const int INF = 0x7fffffff;
int n, m, x, y, t, ans, Left, Right, Up, Down;

int main() {
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
#endif // __AiR_H
    while (scanf("%d %d %d %d", &n, &m, &x, &y) != EOF) {
        if (n > m) { swap(n, m); swap(x, y); } t = (n + 1) / 2; ans = t;
        Left = y; Right = m - y + 1; Up = n - x; Down = x - 1; if (Up == Down) { ++Up; }
        if (min(Left, Right) > t) { ans = min(max(Up, Down), min(Left, Right)); }
        else if ((n % 2) && n == m && x == y && x == (n + 1) / 2) { --ans; }
        printf("%d\n", ans);
    }
#ifdef __AiR_H
    printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);
#endif // __AiR_H
    return 0;
}

3、BZOJ 4801 打牌

题解在www.lydsy.com/JudgeOnline/upload/sol4.pdf

PS:3小时的比赛2.30小时写了这道题,还好过了QwQ。。。智障选手表示真的很懵啊。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <ctime>
#include <cassert>

using namespace std;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define eps 1e-9

typedef long long ll;
typedef pair<int, int> pii;

const int INF = 0x7fffffff;
int T;
int x1, Y1, x2, Y2;

inline int cal(char str[]) {
    if (str[0] == 'A') { return 1; } if (str[0] == 'K') { return 13; }
    if (str[0] == 'Q') { return 12; } if (str[0] == 'J') { return 11; }
    if (str[0] == 'T') { return 10; }
    return str[0] - '0';
}

int main() {
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
#endif // __AiR_H
    char a[5], b[5], c[5], d[5];
    scanf("%d", &T);
    while (T--) {
        scanf("%s %s %s %s", a, b, c, d);
        x1 = cal(a); Y1 = cal(b); x2 = cal(c); Y2 = cal(d);
        if (x1 != 1) { if (Y1 == 1 || x1 < Y1) { swap(x1, Y1); } }
        if (x2 != 1) { if (Y2 == 1 || x2 < Y2) { swap(x2, Y2); } }
        if (x1 == 1 && Y1 == 1) { printf("2\n"); continue; }
        if (x1 != 1 && x2 == 1 && Y2 == 1) { printf("-2\n"); continue; }
        if (x1 == 1 && x2 == 1 && Y2 == 1) { printf("0\n"); continue; }
        if (x1 == 1) {
            if (x2 == 1) {
                if (Y1 < Y2) { printf("%d\n", 1 - Y2); } else { printf("%d\n", 0); } continue;
            }
            if (Y1 >= x2) { printf("%d\n", 1 + Y1); continue; }
            printf("%d\n", 1 - x2); continue;
        }
        if (x2 == 1) {
            if (x1 > Y2 && Y1 == Y2) { printf("%d\n", Y1 - 1); continue; }
            if (Y1 > Y2) { printf("%d\n", Y1 - 1); continue; }
            printf("%d\n", -(1 + Y2)); continue;
        }
        if (x1 == Y1 && x2 == Y2) {
            if (x1 >= x2) { printf("%d\n", x1 * 2); continue; }
            printf("%d\n", -(x2 * 2)); continue;
        }
        if (x1 >= x2) {
            if (Y1 >= x2) { printf("%d\n", x1 + Y1); continue; }
            printf("%d\n", x1 - x2); continue;
        }
        if (x1 > Y2 && Y1 >= Y2) { printf("%d\n", Y1 - x2); continue; }
        printf("%d\n", -(x2 + Y2));
    }
#ifdef __AiR_H
    printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);
#endif // __AiR_H
    return 0;
}


4、hihocoder 1509 异或排序

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <ctime>
#include <cassert>

using namespace std;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define eps 1e-9
#define lc id << 1
#define rc id << 1 | 1
#define lson low, mid, lc
#define rson mid + 1, high, rc

typedef long long ll;
typedef pair<int, int> pii;

const int INF = 0x7fffffff;
const int maxn = 100;
int n;
ll a[maxn], t1[maxn], t2[maxn], b[maxn];
ll t;
bool vis[maxn];

int main() {
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
#endif // __AiR_H
    scanf("%d", &n); REP(i, n) { scanf("%lld", &a[i]); }
    ll ans = 0; memset(b, -1, sizeof(b));
    bool flag = true;
    for (int i = 1; i < n; ++i) {
        if (!flag) { break; }
        if (a[i] == a[i - 1]) { continue; }
        t = a[i - 1]; REP(j, 60) {  t1[j] = t % 2; t /= 2; }
        t = a[i]; REP(j, 60) { t2[j] = t % 2; t /= 2; }
        if (a[i - 1] < a[i]) {
            for (int j = 59; j >= 0; --j) {
                if (t1[j] == 0 && t2[j] == 1) {
                    if (vis[j] && b[j] == 1) { flag = false; break; }
                    vis[j] = true; b[j] = 0; break;
                }
            }
            continue;
        }
        for (int j = 59; j >= 0; --j) {
            if (t1[j] == 1 && t2[j] == 0) {
                if (vis[j] && b[j] == 0) { flag = false; break; }
                vis[j] = true; b[j] = 1; break;
            }
        }
    }
    if (flag) { ans = 1; REP(i, 60) { if (b[i] == -1) { ans *= 2; } } }
    printf("%lld\n", ans);
#ifdef __AiR_H
    printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);
#endif // __AiR_H
    return 0;
}



5、hihocoder 1514 偶像的条件

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <ctime>
#include <cassert>

using namespace std;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define eps 1e-9
#define lc id << 1
#define rc id << 1 | 1
#define lson low, mid, lc
#define rson mid + 1, high, rc

typedef long long ll;
typedef pair<int, int> pii;

const int INF = 0x7fffffff;
const int maxn = 1e6 + 10;
int N, M, L, t, t1, t2, a, b, c, Min = INF;
int A[maxn], B[maxn], C[maxn];
vector<pii> v;

int main() {
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
#endif // __AiR_H
    scanf("%d %d %d", &N, &M, &L);
    REP(i, N) { scanf("%d", &A[i]); } REP(i, M) { scanf("%d", &B[i]); } REP(i, L) { scanf("%d", &C[i]); }
    sort(A, A + N); sort(B, B + M); sort(C, C + L);
    REP(i, N) {
        if (A[i] <= B[0]) { v.push_back(make_pair(A[i], B[0])); continue; }
        if (A[i] >= B[M - 1]) { v.push_back(make_pair(B[M - 1], A[i])); continue; }
        t = lower_bound(B, B + M, A[i]) - B;
        v.push_back(make_pair(B[t - 1], A[i])); v.push_back(make_pair(A[i], B[t]));
    }
    int Size = v.size();
    REP(i, Size) {
        a = v[i].first; b = v[i].second;
        bool flag = true;
        if (C[L - 1] < a) { flag = false; } else { t1 = lower_bound(C, C + L, a) - C; }
        if (flag && C[0] > b) { flag = false; }
        else if (flag) {
            if (C[L - 1] <= b) { t2 = L - 1; }
            else { t2 = lower_bound(C, C + L, b) - C; if (C[t2] > b) { --t2; } }
            if (t1 > t2) { flag = false; }
        }
        if (flag) { Min = min(Min, (b - a) * 2); continue; }
        t1 = INF; t2 = INF;

        if (C[L - 1] <= a) { t1 = (b - C[L - 1]) * 2; }
        else if (C[0] < a) {
            t = lower_bound(C, C + L, a) - C; t1 = (b - C[t - 1]) * 2;
        }
        if (C[0] >= b) { t2 = (C[0] - a) * 2; }
        else if (C[L - 1] > b) {
            t = lower_bound(C, C + L, b) - C; t2 = (C[t] - a) * 2;
        }
        Min = min(Min, min(t1, t2));
    }
    printf("%d\n", Min);
#ifdef __AiR_H
    printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);
#endif // __AiR_H
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值