Codeforces Round #417 (Div. 2)

来源:互联网 发布:思迅收银软件操作手册 编辑:程序博客网 时间:2024/06/03 21:45

雪崩,不知道为何,一脸懵逼一堆小问题。感觉这次思路挺好的,做的两题都是一上来就有思路,没出现什么卡壳。然而,莫名的一堆失误造就了这场血虐……


A. Sagheer and Crossroads


思路:很常规的情景题,细心读题,判断就好了,关键就是耐心分析情景,注意细节(人行道位置),一定不能着急,确保正确理解题意,看完全部样例再做题。

不过这题这次失败的真正原因在于,改了一波程序后最后居然在循环节处忘了取余,这种小失误让人痛心啊,最后得到最坏结果可能数组越界两倍了,这都能过pre我也是惊呆了,还好被hack了。否则cf生涯第一次光头可能就要这么诞生了,很无奈啊


#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>using namespace std;bool light[4][4];int main(){    for(int i=0;i<4;i++)    {        for(int j=0;j<4;j++)        {            int temp;            scanf("%d",&temp);            light[i][j] = (temp == 1 ? true : false) ;        }    }    bool accident = false;    for(int i=0;i<4;i++)    {        if(!light[i][3])        {            continue;        }        for(int j=0;j<3;j++)        {            if(light[i][j])            {                accident = true;                break;            }            if(light[(i+j+1)%4][j])            {                accident = true;                break;            }        }    }    if(accident)    {        printf("YES\n");    }    else    {        printf("NO\n");    }    return 0;}


B. Sagheer, the Hausmeister



思路:这题由于规定关完一层楼所有灯后再上楼,于是就相当于一个局部贪心问题。不过由于每次贪心不仅有步数,不同结果还会对位置造成影响,于是添加一个dp,对于两边不同位置分别求一个贪心,再选取最小值进行转移。其实这题的思路还是挺顺畅的,不过卡了不少位置

1.数据读入时数值相连,要以字符串读取(这个小细节被卡了好多次了,值得加以重视啊)

2.楼层数据读入时倒序(我居然做了这么长时间才发现)

3.上楼数未计入(这个都能忘,我也是醉了)

4.i,j混淆导致楼层跳跃(这个手误我还能说什么)

5.由贪心向dp转化(好吧,这个确实是一开始考虑不周)

6.初始化问题(也不知道自己原来初始化的是什么鬼)

7.一楼独立考虑(要不然没法初始化啊)

8.修改位置变量(坐标与距离不统一,感觉自己都被绕进去了)

9.将不可能数据与相同数据归一化处理(反正都没用,不如常态化,何必单独处理惹事端)

10.中间结果的修改对后方结果造成影响(一定要单独处理中间变量啊,不能随意更改)

这么多小问题,我不失败谁失败,不知道今晚自己什么情况……


#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>using namespace std;bool light[15][110];int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        //cout << m << "*" << n << endl;        for(int i=n-1;i>=0;i--)        {            bool unready = false;            char temp[110];            scanf("%s",temp);            for(int j=0;j<m+2;j++)            {                //cout << i << "**" << j << endl;                if(temp[j] == '1')                {                    unready = true;                    light[i][j] = true;                }                else                {                    light[i][j] = false;                }            }            light[i][0] = unready;        }        //cout << "***" << endl;        bool ready = true;        for(int i=n-1;i>=0;i--)        {            if(light[i][0])            {                ready = false;            }            light[i][m+1] = ready;        }        if(light[0][m+1])        {            printf("%d\n",0);            continue;        }        int lefsum = 0;        int rigsum = 0;        int lef = 0;        int rig = 0;        if(light[0][0])        {            int newlef = 0;            int newrig = 0;            for(int j=1;j<=m;j++)            {                if(light[0][j])                {                    newlef = j;                    break;                }            }            for(int j=m;j>=newlef;j--)            {                if(light[0][j])                {                    newrig = j;                    break;                }            }            lefsum = newrig;            lef = newrig;            rigsum = newrig;            rig = newrig;        }        else        {            lefsum = m+1;            lef = m+1;            rigsum = 0;            rigsum = 0;        }        for(int i=1;i<n;i++)        {            if(light[i][m+1])            {                break;            }            lefsum++;            rigsum++;            if(!light[i][0])            {                continue;            }            int newlef = 0;            int newrig = 0;            for(int j=1;j<=m;j++)            {                if(light[i][j])                {                    newlef = j;                    break;                }            }            for(int j=m;j>=newlef;j--)            {                if(light[i][j])                {                    newrig = j;                    break;                }            }            int sum1,sum2;            int templefsum,templef;            sum1 = lefsum;            sum2 = rigsum;            sum1 += (lef + newrig);            sum2 += (rig + newrig);            //cout << i<<"*"<<sum << "*" << minlen  <<"*" << newlef <<"*" <<newrig<< endl;            templef = newrig;            templefsum = sum1 < sum2 ? sum1 : sum2;            int temprigsum,temprig;            sum1 = lefsum;            sum2 = rigsum;            sum1 += (m + 1 - lef + m + 1 - newlef);            sum2 += (m + 1 - rig + m + 1 - newlef);            //cout << i<<"*"<<sum << "*" << minlen  <<"*" << newlef <<"*" <<newrig<< endl;            temprig = newlef;            //cout << newlef<<"**"<<newrig<<"*"<<sum1 << "**" <<sum2 << endl;            temprigsum = sum1 < sum2 ? sum1 : sum2;            lefsum = templefsum;            rigsum = temprigsum;            lef = templef;            rig = temprig;            //cout << lefsum <<"*" <<lef<< "*" << rigsum <<"*"<<rig<< endl;        }        //cout << light[0][0]<<light[0][3] << light[1][0] << light[1][3]<<endl;        int sum = lefsum < rigsum ? lefsum : rigsum;        printf("%d\n",sum);    }    return 0;}



最后,吐槽一下这期cf的一个很奇葩的地方,c题提交数和过题数都远大于b(然而我并没有看c题),e题提交数和过题数都远大于d(d基本成防ak的题了),a题hack一片(我也不知道为什么,感觉我被hack纯属脑残,不属于技术问题啊),e题居然是本场比赛正确率最高的题(在交题数量相当可观的情况下)。

不过,总而言之,这是一场小失误连天的比赛,虽然没反映什么技术问题,但也一定要慎重对待啊。