ccf刷题记02

43 篇文章 0 订阅
25 篇文章 0 订阅
这是我第一参加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 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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值