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
注意:当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;
}