T1挂了,自测只有10分,废了啊,身败名裂
不过这篇文章的目的是为了计算,如果数据是纯随机均匀分布的,这个东西能得几分
下附考场挂分代码
#include <cstdio>
typedef long long ll;
int T; ll n;
int p[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool R(int A) {
if (A % 400 == 0) return true;
if (A % 100 == 0) return false;
if (A % 4 == 0) return true;
return false;
}
void work() {
scanf("%lld", &n);
if (n <= 2299160) {
ll A = -4712 + (n / 1461) * 4;
ll x = n % 1461;
if (x >= 366) {x -= 366; A++; } // 这里错了,这个大括号应该把后两行括起来
if (x >= 365) {x -= 365; A++; }
if (x >= 365) {x -= 365; A++; }
ll B = 1;
for (int i = 1; i <= 12; i++) {
int t = ((A % 4 == 0) && i == 2) ? 29 : p[i];
if (x >= t) {x -= t; B++; }
else {B = i; break; }
}
if (A <= 0) printf("%lld %lld %lld BC\n", x+1, B, 1-A);
else printf("%lld %lld %lld\n", x+1, B, A);
return;
}
n -= 2299161;
n += 287;
ll A = 1582 + (n / 146097) * 400;
ll x = n % 146097;
while (true) {
ll t = R(A) ? 366 : 365;
if (x >= t) {x -= t; A++; }
else break;
}
ll B = 1;
for (int i = 1; i <= 12; i++) {
int t = (R(A) && i == 2) ? 29 : p[i];
if (x >= t) {x -= t; B++; }
else {B = i; break; }
}
printf("%lld %lld %lld\n", x+1, B, A);
}
int main() {
freopen("julian.in", "r", stdin);
freopen("julian.out", "w", stdout);
scanf("%d", &T);
while (T--) work();
}
这个东西会判错所有 年之前的闰年的 月 日。
就连公元前 那个也挂了,data1 都不能保证对,因此我的最低得分是 分呜呜呜
由此可以计算,如果数据是纯随机的,在 限制内均匀分布,这东西期望能得几分
以下正确率精确到小数点后四位
测试点编号 | 出错日期数 | 正确率 | ||
---|---|---|---|---|
故得分的期望约为 分
另,似乎这种错法的同学很多,我和一样错误的同学贴贴呜呜呜
2020.11.16 update: 官方数据实际得分30,过了数据点3,9,10,符合预期。