ccf刷题记02

来源:互联网 发布:mac版的rar 解压软件 编辑:程序博客网 时间:2024/05/28 23:19
这是我第一参加ccf的题,第一次参加就做了三题,虽然分没拿全,但也确实可喜可贺,然而代码已无存,无妨,再做一次又如何,当年做了5h,看现在自己进步了多少吧


感觉还可以,5min,a题,20min,b题,最后总耗时1h左右成功三题,相比于之前,进步还是相当可观的,加油

201609-1 最大波动

思路:这题又是水题,扫一遍数组,统计一下最大值就好了

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 1e5+10;int myabs(int a){    if(a<0)    {        a *= (-1);    }    return a;}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        int la,now;        int maxchange = 0;        scanf("%d",&la);        for(int i=1;i<n;i++)        {            scanf("%d",&now);            if(myabs(now-la)>maxchange)            {                maxchange = myabs(now-la);            }            la = now;        }        printf("%d\n",maxchange);    }    return 0;}

201609-2 火车购票

思路:预处理每排最大连续座位,模拟安排策略就好了,最后注意一下把座位转化成座位号,对于连续座位的维护,因为n特别小,每次更改都O(n)暴力维护一下就好了

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 1e5+10;bool seat[20][5];int maxseat[20];int main(){    memset(seat,false,sizeof(seat));    for(int i=0;i<20;i++)    {        maxseat[i] = 5;    }    int n;    scanf("%d",&n);    while(n--)    {        int p;        scanf("%d",&p);        int lin;        for(lin=0;lin<20;lin++)        {            if(maxseat[lin]>=p)            {                int st;                for(st=0;st<5;st++)                {                    int row;                    for(row=0;row<p;row++)                    {                        if(seat[lin][st+row])                        {                            break;                        }                    }                    if(row == p)                    {                        break;                    }                }                for(int row=0;row<p;row++)                {                    seat[lin][st+row] = true;                    if(row==p-1)                    {                        printf("%d\n",lin*5+st+row+1);                    }                    else                    {                        printf("%d ",lin*5+st+row+1);                    }                }                int realnowmaxseat = 0;                int nowmaxseat = 0;                for(int row=0;row<5;row++)                {                    if(!seat[lin][row])                    {                        nowmaxseat++;                    }                    else                    {                        if(nowmaxseat>realnowmaxseat)                        {                            realnowmaxseat = nowmaxseat;                        }                        nowmaxseat = 0;                    }                }                if(nowmaxseat>realnowmaxseat)                {                    realnowmaxseat = nowmaxseat;                }                maxseat[lin] = realnowmaxseat;                break;            }        }        if(lin == 20)        {            for(int i=0;p>0&&i<20;i++)            {                for(int j=0;p>0&&j<5;j++)                {                    if(!seat[i][j])                    {                        seat[i][j] = true;                        p--;                        if(p==0)                        {                            printf("%d\n",i*5+j+1);                            break;                        }                        else                        {                            printf("%d ",i*5+j+1);                        }                        int realnowmaxseat = 0;                        int nowmaxseat = 0;                        for(int row=0;row<5;row++)                        {                            if(!seat[i][row])                            {                                nowmaxseat++;                            }                            else                            {                                if(nowmaxseat>realnowmaxseat)                                {                                    realnowmaxseat = nowmaxseat;                                }                                nowmaxseat = 0;                            }                        }                        if(nowmaxseat>realnowmaxseat)                        {                            realnowmaxseat = nowmaxseat;                        }                        maxseat[i] = realnowmaxseat;                    }                }            }        }    }    return 0;}

201609-2 炉石传说

思路:建立一个随从数据结构,将英雄处理为第0个随从,并将死亡的随从攻击了记为0,同样是n十分小,每次都O(n)模拟即可,细心最关键

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 1e5+10;typedef struct FOLLOWER{    int health;    int attack;}Follower;Follower f[2][10];int main(){    int n;    scanf("%d",&n);    memset(f,-1,sizeof(f));    f[0][0].health = 30;    f[0][0].attack = 0;    f[1][0].health = 30;    f[1][0].attack = 0;    //memset(fB,-1,sizeof(fB));    //cout << fA[0].attack << " " << fA[0].health << " " << fA[6].health << " " << fA[6].attack<<endl;    int now = 0;    while(n--)    {        char temp[10];        scanf("%s",temp);        if(strcmp(temp,"end")==0)        {            now = (now + 1) % 2;        }        else if (strcmp(temp,"summon")==0)        {            int pos;            scanf("%d",&pos);            for(int i=6;i>=pos;i--)            {                f[now][i+1] = f[now][i];            }            scanf("%d%d",&f[now][pos].attack,&f[now][pos].health);        }        else        {            int a,b;            scanf("%d%d",&a,&b);            int nex = (now + 1) % 2;            f[now][a].health = f[now][a].health - f[nex][b].attack;            f[nex][b].health = f[nex][b].health - f[now][a].attack;            if(f[now][a].health<=0)            {                for(int i=a;i<7;i++)                {                    f[now][i] = f[now][i+1];                }                f[now][7].attack = -1;                f[now][7].health = -1;            }            if(f[nex][b].health<=0)            {                if(b==0)                {                    break;                }                for(int i=b;i<7;i++)                {                    f[nex][b] = f[nex][i+1];                }                f[nex][7].attack = -1;                f[nex][7].health = -1;            }        }    }    if(f[0][0].health <= 0)    {        printf("-1\n");    }    else if(f[1][0].health <= 0)    {        printf("1\n");    }    else    {        printf("0\n");    }    printf("%d\n",f[0][0].health);    int len1;    for(len1=1;len1<=7;len1++)    {        if(f[0][len1].attack==-1)        {            break;        }    }    len1--;    printf("%d",len1);    for(int i=1;i<=len1;i++)    {        printf(" %d",f[0][i].health);    }    printf("\n");    printf("%d\n",f[1][0].health);    int len2;    for(len2=1;len2<=7;len2++)    {        if(f[1][len2].attack==-1)        {            break;        }    }    len2--;    printf("%d",len2);    for(int i=1;i<=len2;i++)    {        printf(" %d",f[1][i].health);    }    printf("\n");    return 0;}

然而,90分,被卡了,心塞塞的

看来还是细节问题,数据很可能出现什么比较坑的地方,比如负攻击了啊这些的,所以,还是自己老老实实开个数组统计人数吧,其他也没啥

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 1e5+10;typedef struct FOLLOWER{    int health;    int attack;}Follower;Follower f[2][10];int num[2] = {0,0};int main(){    int n;    scanf("%d",&n);    //memset(f,-1,sizeof(f));    f[0][0].health = 30;    f[0][0].attack = 0;    f[1][0].health = 30;    f[1][0].attack = 0;    //memset(fB,-1,sizeof(fB));    //cout << fA[0].attack << " " << fA[0].health << " " << fA[6].health << " " << fA[6].attack<<endl;    int now = 0;    while(n--)    {        char temp[10];        scanf("%s",temp);        if(strcmp(temp,"end")==0)        {            now = (now + 1) % 2;        }        else if (strcmp(temp,"summon")==0)        {            int pos;            scanf("%d",&pos);            for(int i=num[now];i>=pos;i--)            {                f[now][i+1] = f[now][i];            }            scanf("%d%d",&f[now][pos].attack,&f[now][pos].health);            num[now]++;        }        else        {            int a,b;            scanf("%d%d",&a,&b);            int nex = (now + 1) % 2;            f[now][a].health -= f[nex][b].attack;            f[nex][b].health -= f[now][a].attack;            if(f[now][a].health<=0)            {                for(int i=a;i<num[now];i++)                {                    f[now][i] = f[now][i+1];                }                f[now][7].attack = -1;                f[now][7].health = -1;                num[now]--;            }            if(f[nex][b].health<=0)            {                if(b==0)                {                    break;                }                for(int i=b;i<num[nex];i++)                {                    f[nex][b] = f[nex][i+1];                }                f[nex][7].attack = -1;                f[nex][7].health = -1;                num[nex]--;            }        }    }    if(f[0][0].health <= 0)    {        printf("-1\n");    }    else if(f[1][0].health <= 0)    {        printf("1\n");    }    else    {        printf("0\n");    }    printf("%d\n",f[0][0].health);    int len1 = num[0];    /*for(len1=1;len1<=7;len1++)    {        if(f[0][len1].attack==-1)        {            break;        }    }    len1--;*/    printf("%d",len1);    for(int i=1;i<=len1;i++)    {        printf(" %d",f[0][i].health);    }    printf("\n");    printf("%d\n",f[1][0].health);    int len2 = num[1];    /*for(len2=1;len2<=7;len2++)    {        if(f[1][len2].attack==-1)        {            break;        }    }    len2--;*/    printf("%d",len2);    for(int i=1;i<=len2;i++)    {        printf(" %d",f[1][i].health);    }    printf("\n");    return 0;}


文章地址:http://blog.csdn.net/owen_q/article/details/78209997

原创粉丝点击