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]

附加文件