C08-team5
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
结果:
{{{
能做的基本都做出来了,E比较可惜。
}}}
问题:
{{{
开场我先敲的B,由于写的时间有点长,导致有点不自信了,刚交上去就发现逻辑错了,WA了之后倒是镇静了许多。
这场比赛1y的题目比较少,都是由于考虑的情况不全面或题目没有读透,这些以后都要注意。
由于肉题比较多,有肥羊在就安心了不少,4个小时后过掉了8题。
比较可惜的是E,当想出算法后,还是有些细节疏漏了,我在写代码的时候也没有考虑仔细,其实并不复杂的东西被我写了很多行。
1WA掉之后,我们仔细读题后又发现了一些细节问题,后来改正后还是一直WA。
回yq的途中riversouther想到相遇时间必须要在同一天,这点在我的代码中并没有体现出来。后来重写了之后AC。
写程序之前还是要想清楚,另外我还是得再自信一些,不能总畏手畏脚的,自身实力急需提高。
}}}
附:
{{{
// the code of problem E
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 128;
const int MAXM = 1100000;
int M, N, K, tot;
int s1[MAXN], s2[MAXN], t[MAXN];
int rv[MAXM];
map <int, int> mp;
set <int> f[MAXM];
inline void read(int s[], const int n) {
int h, m;
for (int i=0; i<n; ++i) scanf("%d:%d", &h, &m), s[i] = h * 60 + m;
}
inline void read() {
read(s1, M);
read(s2, N);
scanf("%d", &K);
read(t, K);
}
inline int calc_time(int left, int right, int mid) {
if (mid < left && mid < right) return mid - left + mid - right + 24 * 60 * 2;
if (mid >= left && mid >= right) return mid - left + mid - right;
return -1;
}
void brute_force() {
int i, j, k;
int x, y;
for (i=0; i<MAXM; ++i) f[i].clear();
mp.clear();
for (tot=i=0; i<M; ++i) {
for (j=0; j<N; ++j) {
for (k=0; k<K; ++k) {
x = calc_time(s1[i], s2[j], t[k]);
if (x <= 0 || x >= 24 * 60) continue;
if (!mp.count(x)) mp[x] = tot++;
f[y = mp[x]].insert(k);
rv[y] = x;
}
}
}
}
void gao() {
int i, j, k;
int cnt(0), out;
for (i=0; i<tot; ++i) if (f[i].size() == K) ++cnt, out = rv[i];
if (cnt == 0) puts("il bugiardo passeggeri!");
else if (cnt == 1) printf("%02d:%02d\n", out/60, out%60);
else printf("%d scelte\n", cnt);
}
int main() {
while (scanf("%d %d", &M, &N), M||N) {
read();
brute_force();
gao();
}
return 0;
}
}}}
[by delta_4d]
结果:
能做的基本都做出来了,E比较可惜。
问题:
开场我先敲的B,由于写的时间有点长,导致有点不自信了,刚交上去就发现逻辑错了,WA了之后倒是镇静了许多。
这场比赛1y的题目比较少,都是由于考虑的情况不全面或题目没有读透,这些以后都要注意。
由于肉题比较多,有肥羊在就安心了不少,4个小时后过掉了8题。
比较可惜的是E,当想出算法后,还是有些细节疏漏了,我在写代码的时候也没有考虑仔细,其实并不复杂的东西被我写了很多行。
1WA掉之后,我们仔细读题后又发现了一些细节问题,后来改正后还是一直WA。
回yq的途中riversouther想到相遇时间必须要在同一天,这点在我的代码中并没有体现出来。后来重写了之后AC。
写程序之前还是要想清楚,另外我还是得再自信一些,不能总畏手畏脚的,自身实力急需提高。
附:
// the code of problem E
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 128;
const int MAXM = 1100000;
int M, N, K, tot;
int s1[MAXN], s2[MAXN], t[MAXN];
int rv[MAXM];
map <int, int> mp;
set <int> f[MAXM];
inline void read(int s[], const int n) {
int h, m;
for (int i=0; i<n; ++i) scanf("%d:%d", &h, &m), s[i] = h * 60 + m;
}
inline void read() {
read(s1, M);
read(s2, N);
scanf("%d", &K);
read(t, K);
}
inline int calc_time(int left, int right, int mid) {
if (mid < left && mid < right) return mid - left + mid - right + 24 * 60 * 2;
if (mid >= left && mid >= right) return mid - left + mid - right;
return -1;
}
void brute_force() {
int i, j, k;
int x, y;
for (i=0; i<MAXM; ++i) f[i].clear();
mp.clear();
for (tot=i=0; i<M; ++i) {
for (j=0; j<N; ++j) {
for (k=0; k<K; ++k) {
x = calc_time(s1[i], s2[j], t[k]);
if (x <= 0 || x >= 24 * 60) continue;
if (!mp.count(x)) mp[x] = tot++;
f[y = mp[x]].insert(k);
rv[y] = x;
}
}
}
}
void gao() {
int i, j, k;
int cnt(0), out;
for (i=0; i<tot; ++i) if (f[i].size() == K) ++cnt, out = rv[i];
if (cnt == 0) puts("il bugiardo passeggeri!");
else if (cnt == 1) printf("%02d:%02d\n", out/60, out%60);
else printf("%d scelte\n", cnt);
}
int main() {
while (scanf("%d %d", &M, &N), M||N) {
read();
brute_force();
gao();
}
return 0;
}
[by delta_4d]
附加文件
- c8.zip by delta_4d