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;
}
B题:
#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;
}
D题:
#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;
}