ccf刷题记01

43 篇文章 0 订阅
12 篇文章 0 订阅

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

先补上之前做的题吧

从两道才做的题开始

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 学生排队

思路:又是个队列模拟,数组下标的理解思路一定要清晰,难度不大,两个数组,一个记录队列相应位置的人,一个记录人在队列中的位置,关键就在细心吧

#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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值