CCF各题目满分代码

1 篇文章 0 订阅
1 篇文章 0 订阅

      CCF随便找题目入门练习,该博客用来积累代码。每做完一题都会更新,欢迎讨论和指正不足。(代码不多,主要用来自己积累吧,所以懒得加注释了)

201909-1 小明种苹果:

#include <iostream>

using namespace std;
int A[1010][1010],B[1010];
int main() {
	int N,M,i,j,ma,mi,S;
	
	cin >> N >> M;
	for(i=0;i<N;i++){
		for(j=0;j<M+1;j++){
			cin>>A[i][j];	
		}
	}
	ma=0;
	mi=0;
	S=0;
	for(i=0;i<N;i++){
		B[i]=0;
		for(j=1;j<M+1;j++){
			B[i]+=A[i][j];
		}
		S+=A[i][0]+B[i];
		if(-B[i]>ma){
			ma=-B[i];
			mi=i+1;
		}
	}
	ma=B[mi-1];
	cout<<S<<' '<<mi<<' '<<-ma;
	return 0;
}

201909-2 小明种苹果(续):

#include <iostream>
using namespace std;

int A[1010][1010],B[1010];
int main() {
	int N,m,i,j,k,mi,S1,T,s,s2,ii;
	cin>>N;

	T=0;
	for(i=0;i<N;i++){
		B[i]=0;
		mi=0;
		cin>>A[i][0];
		for(j=1;j<A[i][0]+1;j++){
			cin>>A[i][j];
			if(A[i][j]>0&&j>mi){
				mi=j;
			}
		}
		S1=A[i][mi];
		for(k=mi+1;k<A[i][0]+1;k++){
				S1+=A[i][k];
		}
		T+=S1;
		S1=A[i][1];
		for(k=1;k<A[i][0]+1;k++){
			if(A[i][k]>0){
				if(S1!=A[i][k]){
					B[i]=1;
				}
			}
			else{
				S1+=A[i][k];
			}
		}
	}
	s=0;
	s2=0; 
	for(i=0;i<N;i++){
		if(B[i]==1){
			s++;
			if(i+2<N){
				if(B[i+1]==1&&B[i+2]==1){
					s2++;
				}
			}
			else if(i+1<N&&i+2==N){
				if(B[i+1]==1&&B[0]==1){
					s2++;
				}
			}
			else if(i+1==N){
				if(B[0]==1&&B[1]==1){
					s2++;
				}
			}
			else{
			}
		}
	}
	cout<<T<<' '<<s<<' '<<s2;
	return 0;
}

201903-1 小中大:

#include <iostream>
#include <stdio.h>
using namespace std;
int a[100000];
int main()
{
    int n,ma,mi,w,z1;
    double z,x;
    scanf("%d",&n);
    mi=10000000;
    ma=-10000000;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        if(a[i]>ma){
            ma=a[i];
        }
        if(a[i]<mi){
            mi=a[i];
        }
    }
    w=n/2;
    if(n%2==0){
    	x=(a[w-1]+a[w])/2.0;
    	x=x-int(x);
        if(x==0){
        	z1=(a[w-1]+a[w])/2;
        	printf("%d %d %d",ma,z1,mi);
		}
		else{
			z=(a[w-1]+a[w])/2.0;
			printf("%d %.1f %d",ma,z,mi);
		}
    }
    else{
        z1=a[w];
        printf("%d %d %d",ma,z1,mi);
    }
    return 0;
}

201903-2 二十四点:

#include <iostream>
#include <stdio.h>
using namespace std;

int main() {
	int n,q,j,w,j1;
	char a[8];
	scanf("%d",&n);
	getchar();
	while(n--){
		for(j=0;j<7;j++){
			scanf("%c",&a[j]);
		}
		q=(int)(a[0]-48);
		j=0;
		while(j<6){
            w=0;
            if(a[j+1]=='+'){
                q+=(int)(a[j+2]-48);

                j+=2;
            }
            else if(a[j+1]=='-'){
                q-=(int)(a[j+2]-48);

                j+=2;
            }
            else if(a[j+1]=='x'||a[j+1]=='/'){
                if(a[j-1]=='+'){
                    q-=(int)(a[j]-48);

                }
                else if(a[j-1]=='-'){
                    q+=(int)(a[j]-48);
                }
                else{
                    q=0;
                }

                j1=j-1;
                if(a[j+1]=='x'){
                    w=(int)(a[j]-48)*(int)(a[j+2]-48);

                    j=j+2;
                }
                else{
                    w=(int)(a[j]-48)/(int)(a[j+2]-48);

                    j=j+2;
                }
                while(a[j+1]=='x'||a[j+1]=='/'){
                     if(a[j+1]=='x'){
                        w=w*(int)(a[j+2]-48);

                        j=j+2;
                     }
                     if(a[j+1]=='/'){
                        w=w/(int)(a[j+2]-48);

                        j=j+2;
                     }
                }

                if(a[j1]=='+'||j1<0){
                    q+=w;
                }
                else if(a[j1]=='-'){
                    q-=w;
                }

            }
		}
		if(n==0){
            if(q==24){

                printf("Yes");
            }
            else{
              //  printf("%d\n",q);
                printf("No");
            }
		}
		else{
            if(q==24){
            printf("Yes\n");
            getchar();
		}
            else{
             //   printf("%d\n",q);
                printf("No\n");
                getchar();
            }
		}
	}
	return 0;
}

    201812-1 小明上学:

#include <iostream>
#include <stdio.h>
using namespace std;
int a[100][2];
int main()
{
    int r,y,g,n,s;
    s=0;
    scanf("%d %d %d",&r,&y,&g);
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d %d",&a[i][0],&a[i][1]);
        if(a[i][0]==0||a[i][0]==1){
            s+=a[i][1];
        }
        else if(a[i][0]==2){
            s+=a[i][1]+r;
        }
        else{

        }
    }
    printf("%d",s);
    return 0;
}

201812-2 小明放学:

这个题目有个很大的坑!  代码半小时写出来,调试一小时一直60分。后来问了某大佬,告诉我这个题最多有10^5个红绿灯,而每个红绿灯时长最多不超过10^6,那也就是说,很可能经过所有红绿灯的总时长已经达到了10^5*10^6=10^11了,如果定义的是int 变量来存储时长,已经爆掉了。。。。所以要换成long long(原理自行百度)类型。果不其然,,,,改掉以后直接满分通过。。。

好的,俺百度好了:

                                       

#include <iostream>
#include <stdio.h>
using namespace std;
int a[100001][2];
int main()
{
    int n,b,r,y,g;
    long long s;
    s=0;
    scanf("%d %d %d",&r,&y,&g);
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d %d",&a[i][0],&a[i][1]);
        //如果是通过道路
        if(a[i][0]==0) {
            s+=a[i][1];
        }
        //经过红绿灯
        else{
            //如果出发时候的那盏灯还没结束
            if(s<=a[i][1]){
                //如果出发时候是红灯,则加上该灯剩余的时间
                if(a[i][0]==1){
                    s+=a[i][1]-s;
                }
                //如果出发时候是黄灯,则加上该黄灯剩余和红灯的时间
                else if(a[i][0]==2){
                    s+=a[i][1]-s+r;
                }
                //如果是绿灯则直接通过
                else{
                        //认为最后一刻不可通过。。。
                    if(s==a[i][1]){
                        s+=y+r;
                    }
                    else{

                    }
                }
            }
            //出发时候的灯已结束
            else{
                    //计算多出来的时间
                b=(s-a[i][1])%(r+y+g);

                //如果开始的时候是红灯
                if(a[i][0]==1){
                    //如果多的时间在绿灯范围内
                    if(b<=g){
                            //认为最后一刻不可通过。。。
                        if(b==g){
                            s+=y+r;
                        }
                        else{

                        }

                    }
                    //如果不在绿灯范围内
                    else{

                        s+=y+r-(b-g);
                    }
                }
                //如果一开始是黄灯
                else if(a[i][0]==2){
                    //到达时候为红灯
                    if(b<=r){
                        s+=r-b;

                    }
                    //到达时候为绿灯
                    else if(r<b&&b<=(r+g)){
                            //认为绿灯最后一刻不可通过。。。
                        if(b==r+g){
                            s+=y+r;
                        }
                        else{

                        }

                    }
                    //到达时候为黄灯
                    else{

                        s+=y-(b-r-g)+r;
                    }
                }
                //如果一开始是绿灯
                else{
                    //到达时候在黄灯和红灯内
                    if(b<=y+r){
                        s+=y-b+r;
                    }
                    else{

                    }
                }
            }
        }

    }
    printf("%lld",s);
    return 0;
}

   201809-1 卖菜:

#include <iostream>
#include <stdio.h>
using namespace std;

int main() {
	int n,a[1000],b[1000];
	scanf("%d",&n);
	for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
	}
	for(int i=0;i<n;i++){
        if(i==0){
            b[i]=(a[i]+a[i+1])/2;
        }
        else if(i==n-1){
            b[i]=(a[i-1]+a[i])/2;
        }
        else{
            b[i]=(a[i-1]+a[i+1]+a[i])/3;
        }
	}
	for(int i=0;i<n;i++){
        printf("%d ",b[i]);
	}
	return 0;
}

201809-2 买菜:

这个题又出来long的坑,这次一眼看穿!

#include <iostream>
#include <stdio.h>
using namespace std;
long long a[2000][2];
long long b[2000][2];
int main() {
	int n;
	long long s;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
        scanf("%lld %lld",&a[i][0],&a[i][1]);
	}
	for(int i=0;i<n;i++){
        scanf("%lld %lld",&b[i][0],&b[i][1]);
	}
	s=0;
	for(int i=0;i<n;i++){
            for (int j=0;j<n;j++){
                //如果a的下界大于b的下界且a的上界低于b的上界
                if(a[i][0]>=b[j][0]&&a[i][1]<=b[j][1]){
                    s+=a[i][1]-a[i][0];
                }
                else if(a[i][1]>b[j][0]&&a[i][1]<=b[j][1]&&a[i][0]<=b[j][0]){
                    s+=a[i][1]-b[j][0];
                }
                else if(b[j][1]>a[i][0]&&b[j][1]<=a[i][1]&&b[j][0]<=a[i][0]){
                    s+=b[j][1]-a[i][0];
                }
                else if(a[i][1]>b[j][1]&&a[i][0]<b[j][0]){
                    s+=b[j][1]-b[j][0];
                }
                else{

                }
            }
	}
	printf("%lld",s);
	return 0;
}

没怎么做过oj,做了几题就顶不住了,这也太难搞了。调整心态,慢慢来吧。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值