CodeForces – ntzyz's blog https://archive.ntzyz.io Mon, 18 Sep 2017 12:20:28 +0000 zh-CN hourly 1 https://wordpress.org/?v=5.8 [CodeForces] AIM Tech Round (Div. 2) https://archive.ntzyz.io/2016/04/06/codeforces-aim-tech-round-div-2/ https://archive.ntzyz.io/2016/04/06/codeforces-aim-tech-round-div-2/#respond Wed, 06 Apr 2016 06:25:58 +0000 https://blog.dimension.moe/?p=381 继续阅读[CodeForces] AIM Tech Round (Div. 2)]]> 虽然已经弃坑 ACM 了,但是出于某些原因,最近有复习算法和A题的必要……

DLKH87K{KLY8(_FR()OSE]9

显然因为好久没干这种事儿了,我的打算是先找以前的 CodeForces Div2 的 ABC 题练练手,然后再开始看书,针对性练习。

这次的题目链接:AIM Tech Round (Div. 2)


第一题

可以说前两题等于水题是 CodeForces 的出题套路了,第一题的题意很简单,Luke Skywalker 被困在一个两面墙壁像中间逼近的房间里,题目给出了房间距离和墙的移动速度,以及 Luke Skywalker 自身的宽度,要求你求出他还有多少时间的生命(

随手糊一段代码咯:

#include 

using namespace std;

int main() {
    double a, b, c, d;
    cin >> a >> b >> c >> d;
    cout << (b - a) / (c + d);
    return 0;
}

结果……他挂了……

Input
1 9 1 2

Output
2.66667

Answer
2.66666666666666650000

Checker Log
wrong answer 1st numbers differ - expected: '2.6666667', found: '2.6666700', error = '0.0000013'

嗯……很愉快的进度误差……那就改一下咯:

#include 

using namespace std;

int main() {
    double a, b, c, d;
    cin >> a >> b >> c >> d;
    printf("%.18f", (b - a) / (c + d));
    return 0;
}

这份代码很愉快的过了点,耗时 15ms,内存占用 2200KB,中规中矩。


第二题

题目比较短,要求你用字母表的前 n 个字母,生成一个字符串,要求每个字母出现的次数完全不一样,同时再给定一个序列,对应位置的字母出现的次数不得超过序列中对应位置的值,最后要求能生成的最长的字符串长度。比如这组输入数据:

3
2 5 5

就是使用 a, b, c 这三个字母生成一个字符串,a 出现次数不能超过 2 次, b 和 c 各自出现的次数不能超过 5 次,他的结果就是 11。
最直接的想法就是,每个出现的都要尽可能多,同时也要不重复,那么上面这个例子的最优解显然为 a 出现 2 次,b、c 中一个为 5 次,另一个为 4 次,将出现的次数加起来就得到了样例输出的结果: 11。
想法有了就是编码了,这题用 STL 中提供的 set 就能很容易的解决:

#include 

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    set iset;
    for (int i = 0; i != n; ++i) {
        int temp;
        cin >> temp;
        while (iset.find(temp) != iset.end())
            temp--;
        if (!temp) continue;
        iset.insert(temp);
    }
    int res = 0;
    for (auto it = iset.begin(); it != iset.end(); ++it) {
        res += *it;
    }
    cout << res << endl;
    return 0;
}

嗯,然后又挂了……

Input
26
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000

Output
230195899

Answer
25999999675

Checker Log
wrong answer 1st numbers differ - expected: '25999999675', found: '230195899'

欸两次砸在了精度(?)。所以咯,把数据类型改用 uint64_t 估计就没问题了:

#include 

using namespace std;
int main() {
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    set iset;
    for (int i = 0; i != n; ++i) {
        int temp;
        cin >> temp;
        while (iset.find(temp) != iset.end())
            temp--;
        if (!temp) continue;
        iset.insert(temp);
    }
    uint64_t res = 0;
    for (auto it = iset.begin(); it != iset.end(); ++it) {
        res += *it;
    }
    cout << res << endl;
    return 0;
}

Accepted, 内存消耗和时间占用同第一题。


第三题

去拿快递了……然后上课……回来再做(

]]>
https://archive.ntzyz.io/2016/04/06/codeforces-aim-tech-round-div-2/feed/ 0
[CodeForces] Area of Two Circles’ Intersection https://archive.ntzyz.io/2015/11/28/codeforces-area-of-two-circles-intersection/ https://archive.ntzyz.io/2015/11/28/codeforces-area-of-two-circles-intersection/#respond Sat, 28 Nov 2015 03:54:08 +0000 https://blog.dimension.moe/?p=296 继续阅读[CodeForces] Area of Two Circles’ Intersection]]> 精度锅(
http://codeforces.com/contest/600/submission/14533609

#include 

using namespace std;

struct Circle{
    long double x,y;
    long double r;
};

///static long double pi = 3.1415926535897932384626433832795028841971693993751058;

long double calArea(Circle c1, Circle c2) {
    long double d;
    long double s, s1, s2, s3, angle1, angle2;

    d = sqrt((c1.x - c2.x) * (c1.x - c2.x) + (c1.y - c2.y) * (c1.y - c2.y));
    if(d >= (c1.r + c2.r))//两圆相离
        return 0;
    if((c1.r - c2.r) >= d)//两圆内含,c1大
        return acos(-1.0) * c2.r * c2.r;
    if((c2.r - c1.r) >= d)//两圆内含,c2大
        return acos(-1.0) * c1.r * c1.r;

    angle1 = acos((c1.r * c1.r + d*d - c2.r * c2.r) / (2 * c1.r * d));
    angle2 = acos((c2.r * c2.r + d*d - c1.r * c1.r) / (2 * c2.r * d));

    s1 = angle1 * c1.r * c1.r;
    s2 = angle2 * c2.r * c2.r;
    if (c1.r > c2.r)
        s3 = c1.r * d * sin(angle1);
    else
        s3 = c2.r * d * sin(angle2);
    s = s1 + s2 - s3;

    return s;
}
int main() {
    ios::sync_with_stdio(false);
    Circle c1, c2;
    cin >> c1.x >> c1.y >> c1.r;
    cin >> c2.x >> c2.y >> c2.r;
    printf("%.20lf", calArea(c1, c2));
	return 0;
}
]]>
https://archive.ntzyz.io/2015/11/28/codeforces-area-of-two-circles-intersection/feed/ 0
[CodeForces 593A] 2Char https://archive.ntzyz.io/2015/11/05/cf-593a-2char/ https://archive.ntzyz.io/2015/11/05/cf-593a-2char/#respond Thu, 05 Nov 2015 04:20:17 +0000 https://blog.dimension.moe/?p=267 继续阅读[CodeForces 593A] 2Char]]> 可以毫不犹豫的说这场CF是我有屎以来最失败的一场了,比赛期间交了两发A题都是Wrong answer on test 3,最终放弃回去(wan)睡(shou)觉(ji),然后愉快的挂了0而且获得了-108的Rating change,成功创下历史最大跌幅~

睡了一觉冷静了一下之后,开始思考为什么会出现这样的问题……至于这道题,原因还是从思路说吧。

题目不难,题意也不难理解,就是给你一些字符串,你要从中选出几个组成一篇文章,要求就是只出现两个字母并且文章要尽可能长。最后输出文章长度。

我也不是什么机智的人,没想到什么厉害的奇技淫巧,所以思路还是按照原始的题意走的。首先定义了一个结构体,用来表示一个字母出现的次数:

typedef struct {
    char ch;
    int n;
}CH;

然后呢,只要再用一个vector,就能很简单的描述单个字符串中每个字符出现的次数了。为了方便,再写一个typedef:

typedef vector WORD;

现在就可以开始处理题目了。首先是读取所有的字符串,把他转化成上面所写的描述方式,即出现了哪些字母,以及他们出现的次数:

int n;
cin >> n;
vector wd(n);
for (auto& w: wd) {
    string tmp;
    cin >> tmp;
    for (auto& c: tmp) {
        bool flag = false;
        for (auto& i: w) {
            if (c == i.ch) {
                i.n++;
                flag = true;
                break;
            }
        }
        if (!flag) {
            CH t;
            t.ch = c;
            t.n = 1;
            w.push_back(t);
        }
    }
}

按照题意,出现三个或者更多字母的字符串是不可能被计入的,于是就把他们筛掉,留下那些只有两个或者一个字母出现过的字符串。判断一个单词中字母出现的的次数很简单,直接用vector的成员函数size()就可以解决。与此同时,把所有的留下的字符串中出现的字母统计一下,放入all中:

WORD all;
vector sel;
for (auto& w: wd) {
    if (w.size() >= 3) continue;
    sel.push_back(w);
    for (auto& i: w) {
        bool flag = false;
        for (auto& c: all)
            if (c.ch == i.ch) {
                c.n += i.n;
                flag = true;
                break;
            }
        if (!flag) 
            all.push_back(i);
    }
}

经过这样一波处理后,sel内就保存了所有只出现过一个或两个字母的字符串,同时all里面统计了sel中所有的字符串中出现过的所有字母。

这样之后,答案所选的字符串毫无疑问就是all中抽出的一个或两个字母,问题也就在这出现了:比赛期间我没有考虑到所有字符串内都只有一个字母的情况!

int res = 0, tmp;
for (int i = 0; i < all.size(); i++) {
    char c1 = all[i].ch;
    tmp = 0;
    //这个循环是比赛后看到错误原因了才补上的
    for (auto& w: sel) {
        if (w.size() == 1 && w[0].ch == c1)
            tmp += w[0].n;
    }
    res = max(tmp, res);
    for (int j = i + 1; j < all.size(); j++) {
        char c2 = all[j].ch;
        tmp = 0;
        for (auto& w: sel)
            if (w.size() == 1 && (w[0].ch == c1 || w[0].ch == c2))
                tmp += w[0].n;
            else if ((w[0].ch == c1 && w[1].ch == c2) || (w[1].ch == c1 && w[0].ch == c2))
                tmp += w[0].n + w[1].n;
        res = max(tmp, res);
    }
}

出了这个问题只要一组很简单的数据就能轻松爆掉我的代码:

1
a

答案显然是1,但是如果按照我原来的代码,直接就跳出循环了,愉快的输出了0……



王诗钧 11:34:07

·每次比赛后,即使做出来的题,也要试着看看别人的代码,看看他是不是用了一种比你更简洁的,bug更少的方式

·比如昨天的第一道题,你发现有bug,那么是不是你的思路可能不是很简洁,用了比较容易出bug的方法

王诗钧 11:35:22

·这样能够提高你以后写程序的正确率

·思维能力要通过思考题目以及看别人的题解获得

王诗钧 11:37:54

 没有努力就可以超过别人的话,只会出现在别人太菜的情况下

于是我就去看了王诗钧的代码,理解后立马把自己的代码改写了试试,全文:

#include 

using namespace std;

typedef struct {
    char ch;
    int n;
}CH;
typedef vector WORD;

int main()
{
    int n;
    int table[256][256];
    for (auto &i: table)
        fill(i, i + 256, 0);
    cin >> n;
    vector wd(n);
    for (auto& w: wd) {
        string tmp;
        cin >> tmp;
        for (auto& c: tmp) {
            bool flag = false;
            for (auto& i: w)
                if (c == i.ch) {
                    i.n++;
                    flag = true;
                    break;
                }
            if (!flag)
                w.push_back({c, 1});
        }
        if (w.size() >= 3) continue;
        if (w.size() == 1)
            table[w[0].ch][0] += w[0].n;
        else
            table[min(w[0].ch, w[1].ch)][max(w[0].ch, w[1].ch)] += w[0].n + w[1].n;
    }
    int res = 0;
    for (int i = 'a'; i <= 'z'; i++)
        for (int j = i + 1; j <= 'z'; j++)
            res = max(res, table[i][j] + table[i][0] + table[j][0]);
    cout << res ;
    return 0;
}

#待补充理解

不过就算是有了别人的方法,还是WA了一次……最后的两个for循环处z没有等号,然后也是愉快的一组数据爆掉代码……

2
z
z

#待补充整体分析

]]>
https://archive.ntzyz.io/2015/11/05/cf-593a-2char/feed/ 0
[Codeforces] 几场CF后的简单总结~ https://archive.ntzyz.io/2015/09/17/sum-up-for-codeforces/ https://archive.ntzyz.io/2015/09/17/sum-up-for-codeforces/#comments Thu, 17 Sep 2015 06:50:30 +0000 http://blog.dimension.moe/?p=118 继续阅读[Codeforces] 几场CF后的简单总结~]]> 不知不觉间距离黑历史已经快要一个月了。在这段时间里,抱着A水题的心态,报名了每一场cf的比赛,算下来也有四场了。

Codefocres给我最大的感受就是,Div2很适合我们这种萌新去找感觉,难度不是很大,每场下来至少也能A两题,前两题基本都是简单的模拟之类。每场之间的难度也控制的比较稳定,不像某Bestcoder那次突然给我两个图两个树直接打死……同时Codeforces英文的题目读下来也比杭电里的英文题好理解不少~

还有一点不得不说的就是Codeforces是开放所有的测试数据和别人提交的代码的,这就使得调试Wrong Answer代码的时候难度降低了不少,同时你也可以看到那些神触写出的巨牛逼的Python代码(

公开的测试数据

Codeforces的比赛时间是当地时间下午6:30,然而生活在东八区的我们就得熬到深夜0:30,再进行持续两小时的比赛。虽然说平常这个时间点也没开始睡,但是思维的活跃度还是不如中午和下午。而且像我这种强迫症在提交结束后也不愿意立即去睡觉,因为大数据的结果还要等一段时间才出,然后真正睡觉的时候就差不多快4点了……

还有一点……无论如何不要直接互相分享代码!Codeforces有查重!我没试过我会乱说?

最后丢上Codeforces个人页的传送门!

]]>
https://archive.ntzyz.io/2015/09/17/sum-up-for-codeforces/feed/ 1
[Coding] 开源!我的所有AC代码。 https://archive.ntzyz.io/2015/09/02/coding-%e5%bc%80%e6%ba%90%ef%bc%81%e6%88%91%e7%9a%84%e6%89%80%e6%9c%89ac%e4%bb%a3%e7%a0%81%e3%80%82/ https://archive.ntzyz.io/2015/09/02/coding-%e5%bc%80%e6%ba%90%ef%bc%81%e6%88%91%e7%9a%84%e6%89%80%e6%9c%89ac%e4%bb%a3%e7%a0%81%e3%80%82/#respond Tue, 01 Sep 2015 16:03:05 +0000 http://blog.dimension.moe/?p=92 继续阅读[Coding] 开源!我的所有AC代码。]]> 以前经常重装系统导致大量代码的丢失(然而并没有什么重要的代码)……

为了避免这种可啪的事再次发生,我决定……

Accepted-codes – Coding.net

反正就放在coding上吧。我会随着A题的进度把代码贴上去。同时如果有了更快的算法我也会更新掉低效的代码。

]]>
https://archive.ntzyz.io/2015/09/02/coding-%e5%bc%80%e6%ba%90%ef%bc%81%e6%88%91%e7%9a%84%e6%89%80%e6%9c%89ac%e4%bb%a3%e7%a0%81%e3%80%82/feed/ 0
[Codeforces] 纪念CF处女赛 https://archive.ntzyz.io/2015/08/23/codeforces-%e7%ba%aa%e5%bf%b5cf%e5%a4%84%e5%a5%b3%e8%b5%9b/ https://archive.ntzyz.io/2015/08/23/codeforces-%e7%ba%aa%e5%bf%b5cf%e5%a4%84%e5%a5%b3%e8%b5%9b/#comments Sat, 22 Aug 2015 18:54:50 +0000 http://blog.dimension.moe/?p=83 追逐着岛娘的身影,我打开了Codeforces的主页……

妈的累死了明天再更

尼玛第一题大数据挂了不想更了

]]>
https://archive.ntzyz.io/2015/08/23/codeforces-%e7%ba%aa%e5%bf%b5cf%e5%a4%84%e5%a5%b3%e8%b5%9b/feed/ 3