ccf刷题记01

来源:互联网 发布:合肥网络总监招聘 编辑:程序博客网 时间:2024/05/19 22:07

这个队长当的有点突然,据说是被张老师推荐到赵老师那里的,天将降大任于斯人也,那么肯定就要加油了啊,起码不能辜负了老师的期待吧,于是开启此刷题记,半个月时间,加油吧

先补上之前做的题吧

先来两题才做的题

201703-1 分蛋糕

思路:按惯例第一题都是水题的,简单模拟,so easy

#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 a[maxn];int main(){    int n,k;    while(scanf("%d%d",&n,&k)!=EOF)    {        int lef = k;        int sum = 0;        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);            lef -= a[i];            if(lef <=0)            {                lef = k;                sum++;            }            //cout << lef << " " << sum << endl;        }        if(lef < k)        {            sum++;        }        printf("%d\n",sum);    }    return 0;}


201703-2 学生排队

思路:又是个队列模拟,数组下标的理解思路一定要清晰,一点点小的错误就能wa到生无可恋,难度不大,两个数组,一个记录队列相应位置的人,一个记录人在队列中的位置,关键就在细心吧

#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 = 1010;int pos[maxn];int que[maxn];int main(){    int n,m;    /*while(*/scanf("%d%d",&n,&m);/*!=EOF)    {*/        for(int i=1;i<=n;i++)        {            pos[i] = i;            que[i] = i;        }        for(int i=0;i<m;i++)        {            int p,q;            scanf("%d%d",&p,&q);            if(q==0)            {                continue;            }            else if(q>0)            {                for(int j=pos[p]+1;j<=pos[p]+q;j++)                {                    que[j-1] = que[j];                    pos[que[j]]--;                }                que[pos[p]+q] = p;                pos[p] += q;            }            else            {                for(int j=pos[p]-1;j>=pos[p]+q;j--)                {                    que[j+1] = que[j];                    pos[que[j]]++;                }                que[pos[p]+q] = p;                pos[p] += q;            }            /*for(int i=1;i<=n;i++)            {                printf("%d ",que[i]);            }            printf("\n");*/            /*for(int i=1;i<=n;i++)            {                printf("%d ",pos[i]);            }            printf("\n");*/        }       for(int i=1;i<n;i++)        {            printf("%d ",que[i]);        }        printf("%d\n",que[n]);    //}    return 0;}


201612-1 中间数

再来看两个个去年做的题吧


思路:寻找中位数,简单判断就好了

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int a[1010];int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d",&a[i]);    }    sort(a,a+n);    bool no = true;    int tup=0,tdown=0;    if(n%2!=0)    {        int cen = (n-1)/2;        while(tup<=cen&&a[cen]==a[cen+tup])        {            tup++;        }        while(tdown<=cen&&a[cen]==a[cen-tdown])        {            tdown++;        }        if(tup==tdown)        {            printf("%d\n",a[cen]);            no = false;        }    }    else    {        int cenup = n/2;        int cendow = cenup-1;        if(a[cenup]==a[cendow])        {            while(tup<=cendow&&a[cenup]==a[cenup+tup])            {                tup++;            }            while(tdown<=cendow&&a[cendow]==a[cendow-tdown])            {                tdown++;            }            if(tup==tdown)            {                printf("%d\n",a[cenup]);                no = false;            }        }    }    if(no)        printf("%d\n",-1);    return 0;}


201612-2 工资计算

思路:又是纯模拟,分类讨论,注意一下精度,没啥大问题

#include <iostream>#include <cstdio>using namespace std;int main(){    int t,sum=0,temp;    scanf("%d",&t);    if(t<=3500)    {        sum=t;    }    else if(t>3500&&t<=4955)    {        temp=t-3500;        temp=(int)((double)(temp)/0.97+1e-9);        sum=temp+3500;    }    else if(t>4955&&t<=7655)    {        temp=t-4955;        temp=(int)((double)(temp)/0.9+1e-9);        sum=temp+5000;    }    else if(t>7655&&t<=11255)    {        temp=t-7655;        temp=(int)((double)(temp)/0.8+1e-9);        sum=temp+8000;    }    else if(t>11255&&t<=30755)    {        temp=t-11255;        temp=(int)((double)(temp)/0.75+1e-9);        sum=temp+12500;    }    else if(t>30755&&t<=44755)    {        temp=t-30755;        temp=(int)((double)(temp)/0.7+1e-9);        sum=temp+38500;    }    else if(t>44755&&t<=61005)    {        temp=t-44755;        temp=(int)((double)(temp)/0.65+1e-9);        sum=temp+58500;    }    else if(t>61005)    {        temp=t-61005;        temp=(int)((double)(temp)/0.55+1e-9);        sum=temp+83500;    }    printf("%d\n",sum);    return 0;}


再来两题大一时做的题,看看当时自己的代码风格,满满的回忆啊,当时用的还是dev


201604-1 折点计数

思路:水题,扫一遍,统计折点就好了

#include<cstdio>using namespace std;int main(){int n,d1,d2,a1,a2,sum=0;scanf("%d",&n);if(n==1){scanf("%d",&a1);printf("%d\n",0);}else{scanf("%d%d",&a1,&a2);d1=a2-a1; if(n==2)printf("%d\n",0);else{for(int i=2;i<n;i++){scanf("%d",&a1);d2=a1-a2;if(d1*d2<0)sum++;d1=d2;a2=a1;}printf("%d\n",sum);}}}

201604-2 俄罗斯方块

思路:模拟俄罗斯方块,现在基本已经不太能看懂当年的代码思路了,也不太想看了,感觉应该就是个模拟,反正当年写了8个循环,哈哈,厉害了

#include<cstdio>using namespace std;int main(){int g[15][10],smg[4][4],lo[4],hi[4],su[4];int po,ma,mi;for(int i=0;i<4;i++){hi[i]=16;lo[i]=20;}for(int i=0;i<15;i++){for(int j=0;j<10;j++){scanf("%d",&g[i][j]);}}for(int i=0;i<4;i++){for(int j=0;j<4;j++){scanf("%d",&smg[i][j]);}}scanf("%d",&po);for(int i=0;i<4;i++){for(int j=3;j>=0;j--){if(smg[j][i]==1){lo[i]=4-j;}}}for(int i=0;i<4;i++){for(int j=0;j<15;j++){if(g[j][i+po-1]==1){hi[i]=j;}}}for(int i=0;i<4;i++){ma=16;mi=4;su[i]=lo[i]+hi[i];if(su[i]<ma){ma=su[i];}if(lo[i]<mi){mi=lo[i];}}ma=ma-mi-1;for(int i=po-1;i<po+3;i++){for(int j=ma,k=mi;j>ma-5+mi;j--,k++){if(g[j][i]==0&&smg[k][i-po+1]==1){g[j][i]=1;}}}for(int i=0;i<15;i++){for(int j=0;j<9;j++){printf("%d ",g[i][j]);}printf("%d\n",g[i][9]);}return 0;}

然而似乎wa了,尴尬,还是自己看看吧

算了,放弃了,还是自己写吧

细节,还是细节问题,数组界限与坐标,大脑一定要清晰

#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 screen[20][20];int block[4][4];int hig[20];int low[4];int main(){    memset(hig,0,sizeof(hig));    for(int i=0;i<4;i++)    {        low[i] = 99;    }    for(int i=15;i>=1;i--)    {        for(int j=1;j<=10;j++)        {            scanf("%d",&screen[i][j]);            if(screen[i][j] == 1&&hig[j] == 0)            {                hig[j] = i;            }        }    }    for(int i=3;i>=0;i--)    {        for(int j=0;j<4;j++)        {            scanf("%d",&block[i][j]);            if(block[i][j] == 1)            {                low[j] = i;            }        }    }    bool emp = true;    for(int j=0;j<4;j++)    {        if(low[j] < 99)        {            emp = false;            break;        }    }    int beg;    scanf("%d",&beg);    if(!emp)    {        int sto = -99;        for(int j=0;j<4;j++)        {            if(hig[j+beg]-low[j]>sto)            {                sto = hig[j+beg]-low[j];            }        }        sto++;        for(int i=sto;i<sto+4;i++)        {            if(i<=0)            {                continue;            }            if(i>15)            {                break;            }            for(int j=0;j<4;j++)            {                screen[i][beg+j] |= block[i-sto][j];            }        }    }    for(int i=15;i>=1;i--)    {        for(int j=1;j<10;j++)        {            printf("%d ",screen[i][j]);        }        printf("%d\n",screen[i][10]);    }    return 0;}

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

原创粉丝点击