A题:水题,统计两列上数字要是只有一个重复输出该数字,如果有多个,就是bad,如果没有就是cheat
B题:推了个数学公式,y(n) = c / 2 + c / (f + 2) + c /(2 * f + 2) + ... + c / ((n - 1) * f + 2) + x / (n * f + 2);
然后y(n) - y(n - 1)化简后得到分母>0,分子为c * n * f + 2 * c - x * f,可以看出函数是先单调递减在单调递增,要求最小值n = (x * f - 2 * c) / (c * f) (上取整和下取整的最小值),然后for一遍计算出答案即可
D题:欺诈游戏就用田忌赛马的方法,真实游戏就用常规的方法即可
C题:扫雷,,还没想到什么好方法,感觉像构造,如果暴力只能过小数据
代码:
A:
#include <stdio.h> #include <string.h> #include <stdlib.h> const int N = 5; int t, s1, s2, i, j; int g1[N][N], g2[N][N], vis[20]; void solve() { int sum = 0; int v; for (int i = 1; i <= 16; i++) { if (vis[i]) sum ++; if (vis[i] == 2) v = i; } if (sum < 7) printf("Bad magician!\n"); else if (sum > 7) printf("Volunteer cheated!\n"); else printf("%d\n", v); } int main() { int cas = 0; scanf("%d", &t); while (t--) { memset(vis, 0, sizeof(vis)); scanf("%d", &s1); for (i = 0; i < 4; i ++) for (j = 0; j < 4; j++) scanf("%d", &g1[i][j]); scanf("%d", &s2); for (i = 0; i < 4; i ++) for (j = 0; j < 4; j++) scanf("%d", &g2[i][j]); for (i = 0; i < 4; i++) vis[g1[s1 - 1][i]]++; for (i = 0; i < 4; i++) vis[g2[s2 - 1][i]]++; printf("Case #%d: ", ++cas); solve(); } return 0; }
#include <stdio.h> #include <string.h> #include <math.h> #define min(a, b) ((a)<(b)?(a):(b)) int t; double c, f, x; int main() { int cas = 0; scanf("%d", &t); while (t--) { scanf("%lf%lf%lf", &c, &f, &x); int n = (int)floor((f * x - 2 * c) / (c * f)); double sum1 = 0; if (n < 0) n = 0; for (int i = 0; i < n; i++) { sum1 += c / (f * i + 2); } double sum2 = sum1 + c / (f * n + 2); sum1 += x / (f * n + 2); sum2 += x / (f * (n + 1) + 2); double sum = min(sum1, sum2); printf("Case #%d: %.7lf\n", ++cas, sum); } return 0; }
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 1005; int t, n, i, j, ans1, ans2; double a1[N], a2[N]; int main() { int cas = 0; scanf("%d", &t); while (t--) { ans1 = ans2 = 0; scanf("%d", &n); for (i = 0; i < n; i++) scanf("%lf", &a1[i]); for (i = 0; i < n; i++) scanf("%lf", &a2[i]); sort(a1, a1 + n); sort(a2, a2 + n); i = 0; j = 0; while (i != n && j != n) { if (a1[i] > a2[j]) j++; else { i++; j++; } } ans2 = j - i; int s = 0, e = n - 1; j = n - 1; while (s <= e) { if (a1[e] < a2[j]) { s++; j--; } else { e--; j--; ans1++; } } printf("Case #%d: %d %d\n", ++cas, ans1, ans2); } return 0; }
Google Code Jam 2014 A,B,D,布布扣,bubuko.com
原文:http://blog.csdn.net/accelerator_/article/details/23598635